<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Reality.SYS &#187; jvm</title>
	<atom:link href="http://www.brakmic.de/index.php/tag/jvm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.brakmic.de</link>
	<description>is corrupted! Reboot Universe? (y/n)</description>
	<lastBuildDate>Mon, 05 Apr 2010 10:50:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Groovy Tutorial &#8211; Teil 2</title>
		<link>http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/</link>
		<comments>http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 18:37:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[kompilieren]]></category>
		<category><![CDATA[konsole]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[skripte]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p>Willkommen zum zweiten Teil des Groovy-Tutorials!</p>
<p>Wie zuletzt angekündigt, widmen wir unsere Aufmerksamkeit den <em>Closures</em> widmen. Jedoch klären wir zuerst, was denn diese <em>Closures</em> sind? Der Begriff ist, wie 99% anderer auch, aus dem Englischen und hat im einfachsten Sinne etwas mit dem &#8220;Abschließen&#8221; von Code zu tun. Im Deutschen werden diese als <em>Funktionsabschlüsse</em>  bezeichnet. <em>Closures</em> sind aber weder irgendein neuer Hype-Begriff, noch handelt es sich um eine komplexe Struktur. Per Definition handelt es sich bei Closures um Gebilde, die ihren Definitionskontext reproduzieren können, selbst wenn dieser von außen nicht mehr sichtbar, d.h. nicht existent ist. Praktisch orientierten Leuten kann man sicherlich einfacher damit helfen, indem man den Begriff der <em>Anonymen Methoden</em> und/oder der <em>inneren Klassen</em> in den Raum wirft. Genauso wie eine <em>Anonyme Methode</em> von außen nicht direkt ansprechbar ist (da ihr &#8220;Definitionskontext&#8221; unsichtbar ist, d.h. diese nicht über einen typischen <em>Funktionskopf</em> verfügen), so kann auch eine Closure in Groovy ohne einen Direktaufruf angewandt werden. Und nicht nur in Groovy, denn Closures sind schon seit der Programmiersprache LISP im Einsatz. Aber, schauen wir uns einfach ein Beispiel an, welches mit dem Auslesen von Dateien zu tun hat.</p>
<p><u><strong>CLOSURES</strong></u></p>
<p><img src="http://img89.imageshack.us/img89/5135/closuresgy1.jpg" alt="Closures mit Groovy" border="1" height="231" width="535" /></p>
<p>Eine Klasse FileReader sorgt in ihrer statischen Main-Methode dafür, dass eine vorgegebene Datei mittels einer Closure ausgelesen wird. Die ganze Arbeit wird in diesem Abschnitt erledigt:</p>
<p><img src="http://img442.imageshack.us/img442/4301/closures2kp9.jpg" alt="Closures mit Groovy - Code" border="1" /></p>
<p>Das Objekt <em>file</em> ermöglicht mittels der Methode <em>eachLine</em> das zeilenweise Auslesen der Datei. Um sich den typischen Boilerplate-Code zu sparen, werden keine typischen &#8220;ist-die-Datei-zu-Ende&#8221;-<em>while</em>-Schleifen implementiert. Stattdessen wird <em>eachLine</em> syntaktisch so behandelt, als ob man genau an dieser Stelle eine neue Methode definiert. Man beachte die {}-Klammern, die bei Methodenaufrufen eigentlich nichts zu suchen haben. Eine Closure wird in diesem Beispiel als eine Referenz übergeben, was wiederum bedeutet, dass Closures Objekte sind.</p>
<p>Zugegeben, all das klingt recht unsinnig und man braucht schon seine Zeit, um sich damit anzufreunden, aber eigentlich ist eine Closure bloß eine Ansammlung von Code, welche sich eben wie ein Objekt verhält und dementsprechend übergeben werden kann. Zugleich aber kann sie wie eine Methode agieren, Parameter entgegennehmen und Werte zurückgeben. Mehr ist nicht drin. Wohl zum Glück <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Im Falle der Anwendung von nur einem Parameter, bietet sich an, die interne Groovy-Variable <em>it</em> anzuwenden:</p>
<p><img src="http://img266.imageshack.us/img266/4629/closures3vh5.jpg" alt="Closures mit Groovy - Code 2" border="1" /></p>
<p>Jedoch bleibt die Frage im Raum, wo der eigentliche Nutzen von Closures zu finden ist? Ruft man sich in Erinnerung den zahlreichen Code, den man &#8220;drumherum&#8221; schreiben muss, nur um eine Collection zu durchwandern, oder aber eine Datei zu bearbeiten, so ist der Vorteil von Closures auf der Hand. Aber nicht nur die schnellere Erledigung von wiederkehrenden und somit auch langweiligen Aufgaben kann elegant mit Closures erledigt werden. Etwas Anderes, das nicht sofort ins Auge springt, lässt sich sehr einfach mit Closures erledigen. Und das ist die Trennung der Steuerungslogik vom aktuell zu bearbeitenden Code. Gesetzt den Fall, dass die obige Klasse nicht einfach die Datei auslesen muss, sondern auch jedes Zeichen in jeder gefundenen Zeile einzeln ausgeben soll, was müsste im Code getan werden?</p>
<p>Genau, nur der Code innerhalb der geschweiften Klammern muss geändert werden und die Steuerung selbst kann erhalten bleiben. Da bei jedem <em>eachLine</em>-Aufruf die Closure auf&#8217;s Neue aufgerufen wird, ist es klar, dass dieser Code nichts mit dem übrigen zu tun hat und problemlos ausgetauscht werden kann.</p>
<p><img src="http://img182.imageshack.us/img182/1592/closures4ap9.jpg" alt="Closures mit Groovy - Code 3" border="1" height="74" width="256" /></p>
<p>Hier lernen wir auch zugleich die Verarbeitung von Collections kennen. Und somit auch eine weitere Besonderheit von Groovy: alles kann zu einer Collection werden, denn alles ist ein Objekt und alle Objekte sind Collections von Daten und Methoden.</p>
<p>Warum ist das aber so?</p>
<p>Nun, es hat damit zu tun, dass in Groovy alle Objekte als <em>Iterable</em> gelten können und somit durchsuchbar sind. Da Groovy die Basisklasse <em>Object</em> von Java nicht nur übernommen, sondern diese auch um eine ganze Reihe von nützlichen Methoden erweitert hat, haben alle Subklassen von Groovy die Möglichkeit, unter anderem, auch spezielle Iteratoren zu implementieren, ohne auf die strukturierte Programmierung wie z.B. <em>for</em>-Schleifen zurückgreifen zu müssen. Stattdessen kann jedes denkbare Objekt &#8220;seine&#8221; Closures anwenden und innerhalb dieser Iteratoren laufen lassen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2008/03/30/groovy-tutorial-teil-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy Tutorial &#8211; Teil 1</title>
		<link>http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/</link>
		<comments>http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 14:01:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[compiler]]></category>
		<category><![CDATA[console]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[kompilieren]]></category>
		<category><![CDATA[konsole]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[skripte]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/</guid>
		<description><![CDATA[Selten habe ich mich über eine neue Programmiersprache so sehr gefreut wie es im Falle von Groovy gewesen ist. Ich muss zugeben, zuerst war ich sehr skeptisch als ich las, dass es sich um eine &#8220;Skriptsprache&#8221; handeln sollte. Jedoch begriff ich später, dass das Ganze nicht so einfach und geradlinig ist, wie es auf den [...]]]></description>
			<content:encoded><![CDATA[<p>Selten habe ich mich über eine neue Programmiersprache so sehr gefreut wie es im Falle von Groovy gewesen ist. Ich muss zugeben, zuerst war ich sehr skeptisch als ich las, dass es sich um eine &#8220;Skriptsprache&#8221; handeln sollte. Jedoch begriff ich später, dass das Ganze nicht so einfach und geradlinig ist, wie es auf den ersten Blick scheint. Groovy ist mehr. Sehr viel mehr. Z.B. ist Groovy die zweite Standardsprache der JVM (Java Virtual Machine), welche von Sun für diese Position zertifiziert wurde. Neben Java ist Groovy die einzige Sprache, die bisher diesen Titel tragen durfte. Dies spricht vor allem für die Themen Kompatibilität und Wiederverwendbarkeit von bereits entwickelten Java-Klassen. Groovy ist aber nicht nur eine Spache die auf Java basiert, Groovy _ist_ Java, schaut nur auf den ersten Blick nicht danach aus. Die Unterschiede sind sicherlich wesentlich geringer als z.B. zwischen Java und Jython oder gar Ruby, jedoch ist Groovy auch eine eigenständige, mit bestimmten Merkmalen versehen Sprache, die man bei Java nicht ohne Weiteres finden kann.</p>
<p>Z.B. ist es bei Java ein Unding, wenn man sog. <a title="Closures" href="http://en.wikipedia.org/wiki/Closure_(computer_science)" target="_blank">Closures</a> entwickeln möchte. Da hat man früher oder später mit <a title="Inner Classes mit Java" href="http://www.artima.com/weblogs/viewpost.jsp?thread=180638" target="_blank">inneren Klassen</a> zu tun und allerlei Problemen in Sachen Zugriffsrechte auf Klassenmember.</p>
<p>Auch ist Java keine <a title="Dynamic Language" href="http://en.wikipedia.org/wiki/Dynamic_programming_language" target="_blank">dynamische Sprache</a>, da deren Compiler im Voraus wissen muss, welchen Datentypen man benutzen wird, um eine bestimmte Variable zu initialisieren. Bei Groovy hingegen ist es ein Leichtes, eine Variable anzulegen und ihren Inhalt dann später, also per <a title="Late Binding" href="http://en.wikipedia.org/wiki/Late_binding" target="_blank"><em>late-binding</em></a> festzulegen.</p>
<p>Bei Java gibt es die <a title="Operatorüberladung" href="http://en.wikipedia.org/wiki/Operator_overloading" target="_blank">Operatorüberladung</a> nicht, weil man diese von C++ her bekannte Eigenschaft nicht weiter verwenden wollte. Nun, bei Groovy hat man diese Möglichkeit wieder.</p>
<p>Mit Groovy lassen sich sowohl reine Java-Applikationen entwicklen, als auch simple Skripte. Das Beste daran ist es, dass man als Programmierer/User gar nicht merkt, wie die ganzen Vorgänge im Hintergrund erledigt werden, denn ein Groovy-Programm wird auf die gleiche Art und Weise behandelt wie ein Skript oder gar ein Webservice. Auch ist es möglich mit Groovy COM-Komponenten zu steuern, Windows-Servies zu schreiben, Servlets usw. usf.</p>
<p>Da ich aber der Meinung bin, dass man alle Vorzüge (und auch Nachteile) der Sprachen erst durch deren Benutzung erkennen kann, zeige ich anhand einiger Beispiele in diesem und den nächsten Tutorials, was Groovy ist, was es kann und wozu es, meiner Meinung nach, gut ist.</p>
<p><span style="font-weight: bold; text-decoration: underline;">INSTALLATION</span></p>
<p>Zuerst installieren wir aber den ganzen Batzen:</p>
<p><strong>a)</strong> Um Groovy zu benutzen, muss man natürlich das jeweilige Package <a title="Groovy herunterladen" href="http://groovy.codehaus.org/Download" target="_blank">herunterladen</a>.</p>
<p><span style="font-weight: bold">b)</span> Unter Windows entpackt man das Paket oder aber lädt den Installer herunter. Damit Groovy laufen kann, benötigt es natürlich eine zuvor installierte <a title="Java Development Kit herunterladen" href="http://java.sun.com/javase/downloads/?intcmp=1281" target="_blank">Java-Umgebung</a>. Am besten ist die neue 1.6-er Version, auch wenn 1.5-er ihren Dienst tun würde. Jedoch schlägt die Benutzung von GraphicsPad unter Java 1.5 fehl, sodass ich doch die 1.6-er empfehle.</p>
<p><strong>c)</strong> Vor der Installation sollte man sich auch vergewissern, dass JAVA_HOME unter den Umgebungsvariablen eingerichtet ist. Im PATH-Eintrag unter den Systemvariablen ist ebenfalls ein Eintrag %JAVA_HOME%\bin zu setzen, damit Groovy und seine Tools die Java-Komponenten finden können. Genauso muss auch GROOVY_HOME gesetzt werden. Und auch hier soll ein Eintrag %GROOVY_HOME%\bin im PATH stehen. Damit kann man wichtige Konsolentools von Groovy in der Kommandozeile anwenden.</p>
<p><strong>d)</strong> Während der Installation wird man unter Windows eine Empfehlung erhalten, dass man doch ein paar zusätzliche Komponenten installieren sollte. Dieser Empfehlung sollte man nachgehen, da diese Komponenten viele nützliche Libs mit sich bringen, die man vielleicht später nützen wird.</p>
<p><strong>e)</strong> Nachdem das Ganze installiert worden ist, wählt man im Menü Programme/Groovy den Eintrag &#8220;Starte GroovyConsole&#8221; aus. Auf den ersten Blick ist das neue Fenster recht &#8220;langweilig&#8221; anzusehen und man kann sich fragen, &#8220;wozu das Ganze&#8221;. Nun, jetzt beginnt der eigentliche Spaß, denn Groovy ist minimalistisch in Sachen Code-Vorarbeit und megalomanisch in Sachen Codier-Möglichkeiten. Denn Groovy ist aus zwei Gründen entstanden: einerseits ist Java als Sprache recht klein, jedoch sind die verschiedenen Libs derart mannigfaltig und aufgebläht, dass man sich nicht mehr fragen muss, ob in Java &#8220;etwas realisierbar ist&#8221;, sondern nur &#8220;womit ist dieses etwas zu realisieren&#8221;? Zweitens ist Java als Sprache in heutiger Zeit eher in eine solche Position geraten, neue Features einzufügen, wenn die Konkurrenz welche auf den Markt bringt. Das beste Beispiel ist C#3.0. Diese Version hat einige Elemente aus der funktionalen Programmierung übernommen, darunter auch die zuvor angesprochenen Closures, also wird sofort ein entsprechender Java-Standard gebastelt. C#3.0 implementiert LINQ (Language Integrated Queries) für eine vereinfachte DB-Verwaltung, also macht es Java nach. Usw. usf. Java ist eindeutig in einer defensiven Position, was eigentlich kein Grund zur Trauer wäre, denn nur so können Programmiersprachen (und andere IT-Komponenten) auf ihre Tauglichkeit getestet werden. Schließlich ist C# als Antwort auf Java entwickelt worden, nachdem Microsoft mit dem seligen <a title="J++" href="http://en.wikipedia.org/wiki/J%2B%2B" target="_blank">J++</a> baden gegangen ist. Irgendwo las ich, dass J++ nichts anderes als ein Programmiersprachenexperiment war, um Java auf seine Vor- und Nachteile zu testen. Nun, Microsofties haben es gelernt und .NET ist die Antwort darauf. Aber, nicht nur MS lernt es, Andere tun es ebenfalls. Und Groovy ist so eine Antwort. Jedoch nicht nur auf C#, sondern auf viele andere Sprachen wie z.B. Python und Ruby. Sie alle haben ihre Vorteile und vor allem was Python und Ruby (on Rails) angeht, so sind die beiden Sprachen als wahre Überflieger (oder Hypes?) zu bezeichnen. Nun, Python nicht gerade als Hype, aber Ruby on Rails auf jeden Fall.</p>
<p>Und so ist Groovy entstanden. Als ein natürlicher Evolutionsschritt. Manche sprechen schon davon, <a title="Groovy will replace Java" href="http://java.dzone.com/news/groovy-will-replace-java-langu" target="_blank">dass Groovy eines Tages Java ablösen wird</a>, aber das ist eine andere Liga in der wir hier nicht spielen.</p>
<p><span style="font-weight: bold; text-decoration: underline;">GROOVY KONSOLE</span></p>
<p>Sehen wir uns man die <em>GroovyConsole</em> an.</p>
<p><img src="http://img409.imageshack.us/img409/2646/groovyconsolenk0.jpg" alt="GroovyConsole" width="454" height="418" /></p>
<p>GroovyConsole besteht aus zwei Teilen. Im oberen werden die Quellcodes eingegeben und im unteren sieht man die Ergebnisse der Ausführung. Groovy-Codes werden entweder über das Menü &#8220;Script&#8221; gestartet oder aber durch STRG+R.</p>
<p>Nun geben wir im Edit-Fenster folgenden, hochkomplexen Code ein:</p>
<p><em>println &#8216;hello, world&#8217;</em></p>
<p>Ein STRG+R führt das Ganze aus.</p>
<p><img src="http://img442.imageshack.us/img442/5510/hellono4.jpg" border="0" alt="Hello World" /></p>
<p>Nun, das Kommando ist an sich nichts Neues, würde man sagen. Jedoch ist jeder geübte Java-Programmierer sofort überrascht, wie es zur Ausgabe kommen kann, wo doch die elementarsten Java-Standards nicht eingehalten worden sind. Und Groovy ist doch Java, oder? So gibt es weder Klammern, noch Semikolons und auch keine <em>import</em>-Anweisungen. Nun, Groovy braucht keine Klammern immer und überall, wenn dies nicht nötig ist und Semikolons am Ende einer Befehlsfolge sind kein Muss mehr, sondern nur optional. Wer will, der kann ruhig klammern und Semikolons anwenden. Es ändert sich aber nichts an der Code-Ausführung. Außerdem braucht man folgende Klassen nicht mehr explizit zu importieren, da Groovy dies für uns automatisch erledigt. Selbst das <em>return</em>-Schlüsselwort ist optional (oh, Schreck!..*hihi*)</p>
<ul>
<li>java.io.*</li>
<li>java.lang.*</li>
<li>java.math.BigDecimal</li>
<li>java.math.BigInteger</li>
<li>java.net.*</li>
<li>java.util.*</li>
<li>groovy.lang.*</li>
<li>groovy.util.*</li>
</ul>
<p>Eine ganze Menge wird da im Hintergrund vorbereitet, ohne dass man dafür irgendetwas tun muss. Groovy heißt nicht ohne Grund &#8220;groovy&#8221;. Aber dies liegt nicht nur an der Tatsache, dass diese Elemente automatisch mit dabei sind, sondern, dass so mancher Boiler-Plate-Code nicht mehr geschrieben werden muss. Hier ein typisches Beispiel in Java und dann ein in Groovy. Als Java-IDE wird Eclipse 3.3.1.1 benutzt.</p>
<p>Es wird eine simple Klasse <em>JDemo.java</em> mit einer Membervariable und zwei Accessors angelegt. Diese Klasse wird dann von einer anderen <em>JTester.java</em> benutzt, um den Wert der Membervariable zu manipulieren und auszugeben. Wie in Java typisch, werden die beiden Getter- und Setter-Methoden mit einem &#8220;get&#8221; respektive &#8220;set&#8221; Präfix versehen.</p>
<p><img src="http://img167.imageshack.us/img167/4388/jdemojavatx3.jpg" border="1" alt="JDemo Klasse" width="447" height="404" /></p>
<p>Und die <em>JTester.java</em>:</p>
<p><img src="http://img168.imageshack.us/img168/2442/jtesterjavavd1.jpg" border="1" alt="JTester Klasse" width="448" height="368" /></p>
<p>Hier ist nichts Besonderes fest zu stellen, da solche Vorgänge in Java x-fach durchgeführt werden. Was hier zu sehen ist, überrascht wirklich niemanden. Es wird eine Klasse instantiiert, einmal die <em>Setter</em>-Methode aufgerufen und ein Wert übergeben. Dieser wird dann auf der Konsole per <em>Getter</em>-Methode <em>getText()</em> ausgegeben.</p>
<p><img src="http://img107.imageshack.us/img107/3963/eclipseexecutionym5.jpg" border="1" alt="Eclipse Ausführung" width="438" height="142" /></p>
<p>Schauen wir uns aber dieselbe Implementierung in Groovy mal an.</p>
<p>Zuerst wird eine Klasse <em>GDemo.groovy</em> angelegt die der Klasse <em>JDemo.java</em> entspricht:</p>
<p><img src="http://img145.imageshack.us/img145/2821/gdemogroovydc9.jpg" border="1" alt="GDemo Klasse" width="374" height="309" /></p>
<p>Dann wird eine weitere Datei, <em>GTester.groovy</em>, angelegt:</p>
<p><img class="size-full wp-image-330 alignnone" title="gtestergroovy1" src="http://www.brakmic.de/wp-content/2008/02/gtestergroovy1.jpg" alt="gtestergroovy1" width="354" height="256" /></p>
<p>In Groovy-Skripten, wie diesem hier, können Anweisungen ohne eine explizite Klassendefinition stehen. Und wie man unschwer erkennen kann, bediene ich mich hier zweier Accessoren der <em>GDemo</em>-Klasse, ohne dass diese explizit angelegt worden sind. Wie ist das möglich?</p>
<p>Die Antwort auf diese Frage kommt gleich. <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="font-weight: bold; text-decoration: underline;">COMPILER &amp; SKRIPTE</span></p>
<p>Sehen wir uns zuerst die ganzen Kompilier- und Skriptvorgänge an.</p>
<p>Bevor diese beiden Quellcodes angewandt werden können, müssen sie natürlich kompiliert werden (ja, auch die Skriptdatei <em>GTester.groovy</em> wird kompiliert). Da Groovy eigentlich Java ist, wäre es sicherlich möglich alles per <em>javac</em> zu erledigen. Da aber dies ein Groovy-Tutorial ist, sehen wir uns mal die Kompilierung mit Groovy an.</p>
<p>Um Kompilieren zu können braucht man entweder einen IDE-Plugin, wie z.B. den für Eclipse, oder aber eine Kommandozeile. Für dieses kleine Beispiel reicht aber die Kommandozeile völlig aus. Um aus <em>GDemo.groovy</em> eine vollwertige Java-Class zu machen, bedarf es folgender Befehlsfolge:</p>
<p><img src="http://img204.imageshack.us/img204/5766/groovycam6.jpg" alt="groovyc Kommando" width="314" height="35" /></p>
<p>Analog zu <em>javac</em> gibt es also einen Compiler <em>groovyc</em>, welcher mit vorangestelltem Schalter <em>-d</em> die neu kompilierten Klassen in das Verzeichnis <em>classes</em> setzt. Sicherlich kann man auch andere Bezeichnungen für das Class-Verzeichnis wählen, aber <em>classes</em> macht irgendwie am meisten Sinn, oder?</p>
<p>Nachdem die Kompilierung (hoffentlich) fehlerfrei zu Ende gegangen ist, findet man im Verzeichnis <em>classes</em> eine neue Datei:</p>
<p><img src="http://img90.imageshack.us/img90/6213/classesmg5.jpg" alt="Inhalt des Verzeichnisses classes" width="490" height="92" /></p>
<p>Damit haben wir die Gewissheit, dass unsere Groovy-Klasse <em>GDemo.groovy</em> von der JVM (Java Virtual Machine) verstanden und ausgeführt werden kann. Jetzt wollen wir die Skriptdatei <em>GTester.groovy</em> benutzen, um auf die Daten von <em>GDemo.groovy</em> zuzugreifen. Und genau an dieser Stelle haben wir es mit einem großen Vorteil von Groovy zu tun, passt gut auf:</p>
<p><img src="http://img402.imageshack.us/img402/7932/groovyqj9.jpg" alt="groovy Aufruf" width="563" height="43" /></p>
<p>Hier wird die eigentlich noch nicht kompilierte Klasse <em>GTester.groovy</em> ausgeführt, indem man <em>einfach so</em> den Interpreter <em>groovy</em> anwendet! Wie geht das denn?</p>
<p>Nun, Groovy war für mich am Anfang auch &#8220;nur&#8221; eine weitere Skriptsprache, bis ich begriffen habe, wie Groovy vorgeht und was Groovy eigentlich ist. Es dürfte auch jedem klar sein, dass Groovy im Grunde genommen Java ist. Aber nicht nur! Groovy ist auch eine Ansammlung von, nennen wir es, <em>Abkürzungen</em>, welche das Leben eines typischen Java-Programmierers erleichtern. So ist z.B. das Auslesen von Dateien unter Groovy ein Leichtes, da man nicht mehr mit den ganzen Streams und Buffern zu tun hat. Man sagt einfach &#8220;gib die Datei aus und zwar zeilenweise&#8221; und schon geschieht es, dank der &#8220;Abkürzungen&#8221;. So ist auch der obige Aufruf auch eine Art Abkürzung, indem man eben nicht explizit kompilieren muss, sondern einfach den Interpreter aufruft und lässig sagt &#8220;hier die Datei mit Anweisungen, kümmere dich mal drum, weil ich keine so große Lust habe, den Compiler immer und immer wieder aufzurufen&#8221;. Man übergibt den Namen der Datei plus den Pfad zur speziellen Groovy-Klassensammlung und zum <em>class</em>-Pfad wo sich die Klasse <em>GDemo.class</em> befindet. Das ist alles. Und in einer IDE ist es noch wesentlich leichter, da man dort überhaupt nichts mehr sieht. Bis auf die Ergebnisse, natürlich <img src='http://www.brakmic.de/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Der ganze Vorgang des Kompilierens von <em>GTester.groovy</em> (denn es wird schon kompiliert!) läuft völlig transparent ab. Groovy ist nämlich gar keine Skript-Sprache. Groovy tut nur so, indem es den Anschein weckt, dass die ganzen Kommandos in einer Groovy-Datei zeilenweise, ähnlich wie bei BATCH-Files, ausgeführt werden. Dem ist aber nicht so, denn alle Groovy-Dateien werden zuerst kompiliert und dann ausgeführt. Lediglich die Transparenz der Aufrufe (auch eine Anwendung der &#8220;Abkürzungsphilosophie&#8221;) sorgt dafür, dass man das Gefühl hat, man hätte es hier mit einer Skriptsprache zu tun.</p>
<p>In meinem Beispiel bediente ich mich einer weiteren Umgebungsvariable GROOVY_EMBED. Dies ist zwar keine Vorgabe und ohnehin kein Muss, jedoch erleichtert einem das Arbeiten, wenn man mal in Zukunft eine neue Version von Groovy und seinen Klassen installieren würde. So verweist bei mir GROOVY_EMBED auf den Pfad <em>C:\Programme\Groovy\Groovy-1.5.4\embeddable</em> in welchem sich die aktuelle Version der Groovy-Klassen <em>groovy-all-1.5.4.jar</em> befindet. Bei einer neuen Version müsste man eigentlich nur die Versionsnummer anpassen, da der Rest der gleiche bleibt. Es ist aber jedem selbst überlassen, wie er(sie) dieses erledigt. Und unter einer IDE ist es eh eine Sache von ein paar Klicks unter den Projektoptionen. Es ist aber auf jeden Fall wichtig zu wissen, dass ohne diese Klassen keine <em>skriptähnliche</em> Groovy-Datei kompiliert werden kann.</p>
<p>Schauen wir uns jetzt die Ausgabe des Aufrufs an:</p>
<p><img src="http://img253.imageshack.us/img253/7492/ausgabexz4.jpg" alt="Ausgabe" width="123" height="34" /></p>
<p>An sich nichts Besonderes wäre da nicht die schon gestellte Frage gewesen, wie es zu dieser Ausgabe kommen konnte, wenn wir in unserer <em>GDemo</em>-Klasse gar keine <em>Getter</em> und <em>Setter</em> Methoden eingetragen haben?</p>
<p>Wie kann man eine Klassenmethode aufrufen, wenn in der Klassendefinition keine angegeben worden ist?</p>
<p>Nun, auch hier gilt der Grundsatz, dass alle Abkürzungen angewandt werden können, sofern diese auch möglich sind. Also braucht man bei Groovy für eine Membervariable keine expliziten <em>Accessoren</em> zu setzen. Vielmehr ist es möglich, im Code der aufrufenden Klasse auch direkt den Variablennamen zu setzen, als ob man direkt die Memebervariable anspricht. Also ist z.B. <em>gdemo.text = &#8220;Demo Text&#8221;</em> möglich. Dies bedeutet aber nicht, dass wirklich die Memebervariable selbst aufgerufen wird, sondern es handelt sich ebenfalls um eine Abkürzung, die das explizite Anwenden des setText-Accessors unnötig macht. Abkürzungen ohne Ende, nicht wahr?</p>
<p>Das ist aber nicht alles, denn die oben angeführten Zeilenkommandos für die Kompilierung können ebenfalls abgekürzt werden. Ich habe sie aber aus rein pädagogischen Gründen angeführt, denn es macht ja bekanntlich mehr Sinn, wenn man weiß auf was man verzichten kann, als wenn man nicht einmal wüsste, was wichtig ist.</p>
<p>Also ist es auch möglich, beide Dateien <em>GDemo.groovy</em> und <em>GTester.groovy</em> anzulegen und nur den Interpreter groovy auszuführen. Und schon wäre die Klasse <em>GDemo.groovy</em> im Hintergrund kompiliert worden, damit dann das Skript <em>GTester.groovy</em> ordentlich ausgeführt werden kann. Sie glauben es nicht? O.K., hier der Beweis:</p>
<p>Wir löschen die zuvor erstellte Klassendatei <em>GDemo.class</em> und das Verzeichnis <em>classes</em>.</p>
<p><img src="http://img263.imageshack.us/img263/245/deleteclasesom7.jpg" alt="Lösche Verzeichnis classes" width="427" height="43" /></p>
<p>Danach vergewissern wir uns, dass im Verzeichnis <em>gdemo</em> nichts außer den beiden Groovy-Dateien vorhanden ist:</p>
<p><img src="http://img98.imageshack.us/img98/893/gdemoverzeichniszr2.jpg" alt="gdemo Verzeichnis" width="487" height="97" /></p>
<p>Und jetzt führen wir <em>GTester.groovy</em> mit dem Interpreter <em>groovy</em> aus:</p>
<p><img src="http://img444.imageshack.us/img444/7420/groovycausfhrungbx6.jpg" alt="groovyc Ausführung" width="516" height="40" /></p>
<p><img src="http://img527.imageshack.us/img527/6938/demotexted8.jpg" alt="Demo Text Ausgabe" width="83" height="22" /></p>
<p>Oh Yes, es funktioniert!</p>
<p>Was passiert denn eigentlich mit <em>GDemo.groovy</em>, wenn wir den Interpreter anweisen, <em>GTester.groovy</em> auszuführen? Nun, da <em>GTester.groovy</em> einige Male auf die <em>GDemo</em>-Klasse zugreift, muss der Interpreter dafür sorgen, dass <em>GDemo.groovy</em> zuerst kompiliert wird, denn ansonsten würde es Fehlermeldungen hageln. Und genau das wird auch im Hintergrund erledigt, bevor <em>GTester.groovy</em> zum Einsatz kommt. Wir haben quasi ein Skript-Feeling inklusive Compiling-Power, ohne aber die ganzen Kommandos selber eingeben zu müssen.</p>
<p>So, damit ist der erste Teil unseres kleinen Tutorials zu Ende. Im nächsten Teil zeige ich, wie mit Groovy problemlos <em>Closures</em>, <em>Listen</em> und <em>Maps</em> angewandt werden können und vielleicht noch ein paar kleine Kniffe mehr&#8230;bis dann!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.brakmic.de/index.php/2008/02/17/groovy-tutorial-teil-1/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
