“Java ist auch eine Insel”, 11. Auflage, jetzt neu im Handel

Cover von Java ist auch eine InselNach mehr als zwei Jahren gibt es ein Update der Insel: https://www.galileo-press.de/java-ist-auch-eine-insel_3606/. Aktualisiert auf Java 8, 1306 Seiten, ISBN 978-3-8362-2873-2, E-Book-Formate: PDF, EPUB, MOBI, Online.

Online ist das Buch nicht mehr, da es zu juristischen Auseinandersetzungen mit Mitbewerben kommen könnte. Vereinfacht ausgedrückt: Etwas verkaufen, was gleichzeitig frei ist, macht den Verlag verletzbar gegenüber Abmahnungen. Online bleibt aber weiterhin die jeweils letzte Version, also komplett wie üblich Auflage 10: http://www.tutego.de/javabuch/; das gilt auch für den 2. Band, den es ebenfalls bald im Handel geben wird.

Weiterhin ist eine PDF mit Kapitel 2 und 3 mit nahezu 300 Seiten vom 1. Band, 11. Auflage, online.

SceneBuilder 2.0 final

SceneBuilder 2.0 ist nun final, das Beta zog sich lange hin:

It has many cool new features and was a complete rewrite from the ground up so that it can be split into parts and embedded in your favorite IDE.

Updates unter http://fxexperience.com/2014/05/announcing-scenebuilder-2-0/, http://docs.oracle.com/javase/8/scene-builder-2/release-notes/jfxsb-release_notes_2-0.htm:

  • JavaFX Scene Builder Kit. JavaFX Scene Builder Kit is an API that allows the integration of Scene Builder panels and functionalities directly into the GUI of a larger application, or a Java IDE, such as NetBeans, IntelliJ, and Eclipse. See Working with the JavaFX Scene Builder Kit for more details.

  • Ability to add custom GUI components to the Library. Custom components imported from a third party JAR file can now be added permanently to the Library of available GUI components. See Adding Custom Components to the Library for more information.

  • Support for new JavaFX 8 UI components. The new UI components, TreeTableView, DatePicker, and SwingNode, that were introduced in the Java SE 8 are now supported in Scene Builder 2.0. To see the list of JavaFX 8 UI components that are available, type FX8 in the Library panel’s search text field.

  • 3D Support. FXML documents containing 3D objects can now be loaded and saved in the Scene Builder tool. You can view and edit properties of the 3D objects using the Inspector panel. You can not, however, create new 3D objects using the Scene Builder tool. See JavaFX Scene Builder User Guide for more information.

  • Support for Rich Text. A new container, TextFlow, is now available in the Library of GUI components. You can drag multiple text nodes and other types of nodes, into the a TextFlow container. You can also directly manipulate the text nodes to re-arrange them in the container. Inline and property editing features are also available for each text node.

  • Library Panel Improvements. The default viewing option for the Library panel is a new feature that gives you the option to view all the component categories as collapsible sections.

  • Hierarchy Panel Improvements. It is now more flexible to re-parent objects from one container to another container. It is also possible to drag and drop an object from the Hierarchy Panel to the Content Panel, and vice versa. You can also now select multiple objects in the Hierarchy Panel in order to re-parent them.

  • Content Panel Improvements. You can now manipulate the components of an HBox, VBox, FlowPane, or Toolbar container directly in the Content Panel to re-order them. You can also insert a new component at any position in the container. Note that this direct manipulation is currently not available for the TilePane container.

  • Inspector Panel Improvements. Many property editors in the Inspector panel use the Suggested List dialog window, which displays a list of selectable values from which you can make a selection instead of manually entering them. For example, the CSS Style editor provides a list of applicable CSS properties, based on the currently selected object(s). List handling has also been simplified. Multi-selection of components of different types (i.e. Button + TextField) is now supported. In addition, the usability of many of the property editors, such as AnchorPane Constraints, Rotate, and Padding, have been improved.

  • Preview Window Improvements. The content in the Preview window is now automatically refreshed as the current FXML document is being edited. Hence, there’s no need to use the Refresh command in order to preview the modified UI layout.

  • Change in the Include FXML Command. When you click File from the Menu bar and then click Include, you can only select the FXML menu item if the current FXML document you are editing is saved on your system’s disk and is not empty.

gwtbootstrap3 Version 0.7 fertig

https://github.com/gwtbootstrap3 ist eine GWT-Bibliothek mit hübschen Komponenten, einen Grid-System, siehe dazu auch https://gwtbootstrap3.github.io/gwtbootstrap3-demo/, alles ist optimiert auf Umfluss für mobile Endgeräte. Es basiert auf Twitter Bootstrap http://getbootstrap.com/. Änderungen in Version 0.7:

  • Added connivence methods to easily set margins/paddings on widgets.
  • Ensured removal of all handlers on the unLoad of widgets
  • Added methods to show/hide/toggle NavbarCollapse
  • Further styled GWT’s CellTable/DataGrid to reflect Bootstrap tables
  • Upped the dependency of GWT to 2.6.0
  • Added submit/reset methods to Form
  • Renamed all setTarget/setToggle methods to setDataTarget/setDataToggle, also any setter that referenced a data* attribute was renamed
  • Added in a check as to not load jQuery if it’s already present
  • Changed the parent of gwtbootstrap3-parent to oss-parent (org.sonatype.oss)

Was ich in meinem Code ändern musste war tatsächlich die *Data* Sache:

dismissButton.setDismiss( ButtonDismiss.MODAL ); –> dismissButton.setDataDismiss( ButtonDismiss.MODAL );

dialog.setKeyboard( true ); –> dialog.setDataKeyboard( true );

anchor.setTarget( "#" + title.hashCode() ); –> anchor.setDataTarget( "#" + title.hashCode() );

anchor.setToggle( Toggle.COLLAPSE ); –> anchor.setDataToggle( Toggle.COLLAPSE );

Real Time Kommunikation mit Animated GIFs

Ein ziemlich intelligenter Trick, um Daten vom Server zum Client zu senden sind Animated GIFs. Ein GIF kann beliebig viele Frames haben und der Client hält die Verbindung offen um noch “den Rest” zu lesen.

https://vimeo.com/49447841

https://github.com/videlalvaro/gifsockets ist eine JVM-Bibliothek in Java und Clojure, das genau das macht: Einen Server zu bauen, der Frame für Frame zum Client streamt. Es gibt ein Start-Frame, dann kann das Serverprogramm beliebig viele Frames senden und zum Schluss ein Abschluss-Frame – dafür gibt es eine API. Allerdings kodiert das Beispiel die Daten (hier Text) als Grafik “Graphics drawString()”; interessanter wäre es, Binärdaten über Farbwerte zu kodieren und auf dem Client dann auszulesen – hier ist also noch Platz für ein weiteres Open-Source-Projekt.

Natürlich brauch so etwas nicht wirklich, wenn man WebSockets nutzen kann. Doch es ist ein interessanter Hack.

Eclipse 4.4 M7 (Luna)

http://download.eclipse.org/eclipse/downloads/drops4/S-4.4M7-201405010200/news/

Für mich ist wichtig:

Java 8: Java™ 8 is here, and JDT fully supports it:

  • The Eclipse compiler for Java (ECJ) implements all the new Java 8 language enhancements
  • Updated significant features to support Java 8, such as Search and Refactoring
  • New formatter options for lambdas
  • Quick Assist and Clean Up to migrate anonymous class creations to lambda expressions and back:

    Before:

    anonymous class with a 1-line method body

    After the Quick Assist (Ctrl+1), the 6 lines are condensed into 1:

    lambda expression -- everything on 1 line

Heute kommt auch der erste Release Candidate (RC) raus.

Inselraus: JDBC Metadaten

Von einer Datenbank können verschiedene Informationen ausgelesen werden. Zum einen sind dies Informationen zu einer bestimmten Tabelle, zum anderen Informationen über die Datenbank selbst.

Metadaten über die Tabelle

Bei der Abfrage über alle Spalten müssen wir die Struktur der Datenbank kennen, insbesondere dann, wenn wir allgemeine Abfragen vornehmen und die passenden Daten herauslesen wollen. So liefert SELECT * FROM Item ein ResultSet mit der Anzahl der Spalten, wie sie die Tabelle Item hat. Doch bevor wir nicht die Anzahl und die Art der Spalten kennen, können wir nicht auf die Daten zugreifen.

Um diese Art von Informationen, so genannte Metadaten, in Erfahrung zu bringen, befindet sich die Klasse ResultSetMetaData, mit der wir diese Informationen erhalten, unter den SQL-Klassen. Metadaten können für jede Abfrage angefordert werden. So lässt sich unter anderem leicht herausfinden:

  • wie viele Spalten wir in einer Zeile abfragen können
  • wie der Name der Spalte lautet
  • welchen SQL-Typ die Spalte hat
  • ob NULL für eine Spalte in Ordnung ist
  • wie viele Dezimalzeichen eine Spalte hat

Einige Informationen über die Bestellelemente

Um Anzahl und Art der Spalten einer Bestelltabelle herauszufinden, werden wir zunächst ein ResultSet mit stmt.executeQuery(„SELECT * FROM Item“) erzeugen und dann via getMetaData() ein ResultSetMetaData-Objekt erfragen. Das ResultSetMetaData-Objekt besitzt viele Methoden, um Aussagen über die Tabelle und die Spalten zu treffen. So fragen wir mit getColumnCount() nach, wie viele Spalten die Tabelle hat. Anschließend lässt sich für jede Spalte der Name und Typ erfragen:

String url = "jdbc:hsqldb:file:TutegoDB;shutdown=true";
String sql = "SELECT * FROM ITEM";
try ( Connection con = DriverManager.getConnection( url, "sa", "" );
      Statement stmt = con.createStatement();
      ResultSet rs = con.createStatement().executeQuery( sql ) ) {
  ResultSetMetaData meta = rs.getMetaData();

  int numerics = 0;

  for ( int i = 1; i <= meta.getColumnCount(); i++ ) {
    System.out.printf( "%-20s %-20s%n", meta.getColumnLabel( i ),
                                        meta.getColumnTypeName( i ) );
    if ( meta.isSigned( i ) )
      numerics++;
  }

  System.out.println();
  System.out.println( "Spalten: " + meta.getColumnCount() +
                      ", Numerisch: " + numerics );
}

interface java.sql.ResultSet
extends Wrapper, AutoCloseable

  • ResultSetMetaDatagetMetaData()throwsSQLException
    Liefert die Eigenschaften eines ResultSet in einem ResultSetMetaData zurück.

interface java.sql.ResultSetMetaData
extends Wrapper

  • intgetColumnCount()
    Liefert die Anzahl der Spalten im aktuellen ResultSet. Das ist praktisch für SQL-Anweisungen wie SELECT *.

Allen folgenden Methoden wird ein int übergeben, das die Spalte kennzeichnet:

  • StringgetCatalogName(intcolumn)
    Gibt den String mit dem Katalognamen der Tabelle für die angegebene Spalte zurück.
  • StringgetColumnName(intcolumn)
    Liefert den Spaltennamen der Tabelle.
  • intgetColumnDisplaySize(intcolumn)
    Maximale Anzahl der Zeichen, die die Spalte einnimmt. So ist bei einer Spalte vom Typ VARCHAR(11) mit einer maximalen Spaltenbreite von zehn Zeichen zu rechnen. Bei numerischen Spalten variiert der Wert.
  • StringgetColumnLabel(intcolumn)
    Gibt einen String zurück, der den Titel der angegebenen Spalte enthält. Der Titel gibt an, welche Überschrift für die Spalte angezeigt werden soll. Einige Datenbanken erlauben die Unterscheidung zwischen Spaltennamen und Spaltentitel.
  • intgetColumnType(intcolumn)
    Der Typ der Spalte wird ermittelt. Der Spaltentyp ist dabei eine Konstante aus der Klasse java.sql.Types. Sie deklariert Konstanten nach dem XOPEN-Standard. Dazu zählen unter anderem BIGINT, BINARY, BIT, BLOB_LOCATOR, CHAR, CLOB_LOCATOR, DATE, DECIMAL, DISTINCT, DOUBLE, FLOAT, INTEGER, JAVA_OBJECT (benutzerdefinierter Datentyp), STRUCT, TIME, TIMESTAMP, TINYINT, VARBINARY, VARCHAR. Die Konstante OTHER zeigt ein datenbankspezifisches Element an und wird auf ein Java-Objekt abgebildet, falls ein Zugriff mittels getObject(…) oder setObject(…) erfolgt.
  • StringgetColumnTypeName(intcolumn)
    Liefert den Namen der Spalte, so wie sie die Datenbank definiert.
  • intgetPrecision(intcolumn)
    Liefert die Dezimalgenauigkeit der Spalte, zurückgegeben als Anzahl der Ziffern.
  • intgetScale(intcolumn)
    Liefert die Genauigkeit der Spalte. Dies ist die Anzahl der Stellen, die nach dem Dezimalpunkt verwendet werden können.
  • StringgetSchemaName(intcolumn)
    Der Name des Tabellenschemas. Wird von den Methoden des DatabaseMetaData-Objekts benutzt. Falls kein Schema vorhanden ist, wird „“ zurückgegeben.
  • StringgetTableName(intcolumn)
    Liefert den Tabellennamen der angegebenen Spalte.
  • booleanisAutoIncrement(intcolumn)
    Stellt fest, ob eine Spalte eine Auto-Increment-Spalte ist. Diese nimmt dann automatisch den nächsten freien Wert an, wenn ein neuer Datensatz eingefügt wird. Ist die erste Zeile einer Tabelle mit einer Auto-Increment-Spalte eingefügt, so nimmt die Spalte den Wert 1 an. In den meisten Datenbanken ist es allerdings nicht möglich, eigene Werte in diesen Spalten einzutragen.
  • booleanisCaseSensitive(intcolumn)
    Berücksichtigt die Spalte die Groß- bzw. Kleinschreibung?
  • booleanisCurrency(intcolumn)
    Enthält die Spalte Geldwerte? Nur einige Datenbanken bieten diesen Spaltentyp.
  • booleanisNullable(intcolumn)
    Ist ein SQL-NULL in der Spalte erlaubt?
  • booleanisSearchable(intcolumn)
    Kann die Spalte in einer SQL-WHERE-Klausel verwendet werden?
  • booleanisSigned(intcolumn)
    Enthält die Spalte vorzeichenbehaftete Datentypen? Vorzeichenbehaftete Typen sind unter anderem INT, LONGINT und SMALLINT. Vorzeichenlose Typen sind unter anderem UINT, ULONG und UBYTE.
  • booleanisReadOnly(intcolumn)
    Ist es möglich, auf die Spalte definitiv nicht schreibend zuzugreifen? Ist das Ergebnis true, kann der Wert also nicht aktualisiert werden.
  • booleanisWritable(intcolumn)
    Ist es prinzipiell möglich, auf die Spalte schreibend zuzugreifen? Häufig wird das als !isReadOnly(column) implementiert.
  • booleanisDefinitelyWritable(intcolumn)
    Kann auf die Spalte definitiv schreibend zugegriffen werden? Viele Datenbanken liefern die gleichen Ergebnisse bei isDefinitelyWritable(…) und isWritable(…). Prinzipiell könnte der Zustand von isWritable(…) abweichen, wenn sich zum Beispiel die Schreibbarkeit dynamisch ändert.

Alle Methoden können eine SQLException auslösen.

Informationen über die Datenbank

Metadaten sind auch für die gesamte Datenbank abfragbar. Beispiele für diese Informationen sind:

  • Welche Tabellen liegen in der Datenbank?
  • Wer ist mit der Datenbank verbunden?
  • Kann die Datenbank nur gelesen oder kann auch in die Datenbank geschrieben werden?
  • Wie lauten die Primärschlüssel für eine Tabelle?
  • Sind gespeicherte Prozeduren auf der Datenbankseite erlaubt?
  • Lassen sich äußere Joins (outer joins) durchführen?

Sind Informationen über die Datenbank gefragt, so lassen sich über Metadaten eines DatabaseMetaData-Objekts beispielsweise Datenbankeigenschaften des Herstellers herausfinden. Zunächst benötigen wir dazu ein DatabaseMetaData-Objekt, das uns getMetaData() von einer Connection gibt. Das DatabaseMetaData-Objekt deklariert eine große Anzahl Methoden:

DatabaseMetaData meta = con.getMetaData();
System.out.println( "Product name " + meta.getDatabaseProductName() );
System.out.println( "Version: " + meta.getDatabaseProductVersion()  );
System.out.println( "Maximum number of connections: " + meta.getMaxConnections() );
System.out.println( "JDBC driver version: " + meta.getDriverVersion() );
System.out.println( "Supports update in batch: " + meta.supportsBatchUpdates() );
System.out.println( "Supports stored procedures: " + meta.supportsStoredProcedures() );

Inselraus: Groovy

Groovy (http://groovy.codehaus.org/) ist eine objektorientierte Skriptsprache, die auf einer JVM läuft und vollen Zugriff auf alle Java-Bibliotheken bietet. Die Sprache hat viele interessante Eigenschaften, die sie zu Java X machen. Groovy setzt auf der Standard-Java-Syntax auf und erweitert diese.[1] Einige Höhepunkte:

Groovy-Feature Beispiel
Statt System.out.print(…)/println(…) reicht ein print bzw. println, und dann muss das Argument auch nicht in runden Klammern stehen. println 1 + 2
print „Wow“
Anweisungen müssen nicht immer mit einem Semikolon abgeschlossen werden, sondern nur dann, wenn mehrere Anweisungen in einer Zeile stehen. print „Wow“
print „Wow“; print „Wow“
Variablen müssen nicht mit einem Typ deklariert werden, das gilt auch bei catch oder Methoden/Konstruktoren. def age = 40
def greet( name ) { print „Hallo “ + name }
try { } catch ( e ) { }
Zeichenketten lassen sich mit einfachen oder doppelten Anführungszeichen angeben. Einzelne Zeichen (char/Character) müssen besonders aufgebaut werden. print „Ja“ == ‚Ja‘      // true
def sign = „-“ as char
Strings in doppelten Anführungszeichen sind besondere GStrings: Enthalten sie $variable bzw. ${ausdruck}, so wird der Inhalt der Variablen bzw. der ausgewertete Ausdruck eingesetzt. def one = 1
print „$one plus $one macht ${1+1}“
// 1 plus 1 macht 2
Strings können über mehrere Zeilen laufen, wenn sie in „““ oder “‘ eingeschlossen sind – folgt ein Backslash am Ende der Zeile, wird kein Zeilenumbruchzeichen eingefügt. print „““
Zeile 1
Zeile 2\
Weiter mit Zeile 2
„““
Alles ungleich 0 und null ist true. if ( 1 ) print ‚Zweig wird genommen‘
Groovy definiert einen neuen Datentyp für Bereiche (engl. ranges). def numbers1 = 0..9
def numbers2 = 0..<10
Erweiterte Zählschleife unter Berücksichtigung von Bereichen, bzw. rechts von in steht ein Iterable wie beim erweiterten for. for ( i in 0..<10 )
print i  // 0123456789
== bei Referenzen bedeutet equals(…)-gleich; ein Identitätsvergleich realisiert is(…). def heinz = ‚Heinz‘
print heinz == ‚Heinz‘  // true
Operatoren können überladen werden, und die Anwendung von Operatoren entspricht Methodenaufrufen, etwa + von plus(…), ++ von next(…) oder [] von getAt(…). println 1 + 2 * 3 // 7
println 1.plus(2).multiply(3) // 9
println 1.plus(2.multiply(3)) // 7
Alle Comparable-Objekte (und damit etwa String, BigInteger, BigDecimal) können mit ==, !=, <, >, <= und >= verglichen werden. Die Ordnung liefert compareTo(…). def heinz = ‚Heinz‘
print heinz < ‚Werner‘  // true
Ist in Java nur java.lang standardmäßig importiert, ist es bei Groovy viel mehr, etwa noch java.io, java.util, java.net und noch einige. print new File(‚file.txt‘).exists()
Statt explizit auf Datenstrukturklassen für Listen und Mengen zurückzugreifen, bietet Groovy eine spezielle Syntax. def primes = [ 2, 3, 5, 7]
print primes[ 0 ]
def dic = [ ‚rot‘ : ‚red‘, ‚blau‘ : ‚blue‘ ]
print dic[‚rot‘]  // red
Die Operatoren ?. und ?: (Elvis-Operator) verhindern null-Zugriffe. def name = ‚Chris‘
println name ?: ‚Kein Name‘  // Chris
name = null
println name ?: ‚Kein Name‘  // Kein Name
Der Zugriff auf Zeichen über [] ist bei den Zeichenkettenklassen String, StringBuffer, StringBuilder möglich. def s = ‚Ooog‘
print s[0]   // O
Der Zugriff über [] lässt auch Bereiche zu. def s = „tutego“
print s[ 0, 1, 3..5 ] // tugeo
def t = new StringBuilder( „tutego“ )
t[ 1..4 ] = „X“
print t  // tXo
Der Operator << hängt Dinge an Strings (Rückgabe ist dann StringBuffer), Listen oder Dateien an. def s = ‚oger‘
def sb = ‚Das ist ‚ << s << ‚ oder?‘
print sb       // Das ist oger oder?
def file = new File(„out.txt“)
file << „Zeile 1“
Reguläre Ausdrücke werden mit einer eigenen Syntax direkt von der Sprache unterstützt; =~ ist ein find, ==~ ein match. print ‚2010‘ ==~ /\d+/
erweitertes switch-case etwa mit regulären Ausdrücken und Bereichen switch ( 42 ) {
case 0..100  : println ‚ist zwischen 0..100‘; break
case Integer : println ‚ist Integer‘; break
case { it % 2 == 0 }: println ‚ist gerade‘; break
case ~/\d\d/: println ’42 passt auf das Pattern‘; break
}
Datentyp für Dauer und spezielle Eigenschaften für Datumswerte und überladene Operatoren zum leichten Rechnen mit dem Paket groovy.time use ( groovy.time.TimeCategory ) {
def today = new Date()
def tomorrow = today + 1.day
print „Morgen: $tomorrow, nächstes Jahr ${today + 1.year}“
}
Closures als Codeblöcke werden unterstützt und finden überall in der Groovy-API Anwendung. new File( „file.txt“ ).eachLine {
println it
}
def names = [ „Charisma“, “  „, „Tina“, „“ ]
print names.findAll { ! it.trim().isEmpty() }
// [Charisma, Tina]
Setter/Getter müssen nicht aufgerufen werden; beim Zugriff ref.property wird automatisch der Setter/Getter aufgerufen. def p = new Point( 10, 20 )
print p.location.x  // 10.0
In Methoden mit Rückgabe kann das Schlüsselwort return entfallen. def add( a, b ) { a + b }
Default-Parameter bei Methodendeklarationen static tax( cost, taxRate = 19 ) {
cost * taxRate / 100
}
println tax( 100 )       // 19
println tax( 100, 7 )    // 7
Methoden und Klassen sind standardmäßig public, nicht paketsichtbar wie bei Java. Groovy erstellt automatisch Setter/Getter. class Person { def  name }
Mit der Klassenannotation @Immutable wird ein Typ unveränderbar, mit @Singleton ein Singleton mit einem privaten Konstruktor und öffentlichem Attribut instance für die eine Instanz. @Immutable class Pair { String val1, val2 }
@Singleton class AppWindow { }
Diverse Builder-Klassen erleichtern den Aufbau von hierarchischen XML- oder Swing-Bäumen ebenso wie Ant-Build-Skripten. import groovy.xml.MarkupBuilder
def writer = new StringWriter()
new MarkupBuilder( writer ).html {
head { title ‚Zählen mit Graf Zahl‘ }
body {
h1 ( ‚Willkommen‘ )
p {
ul { (1..10).each { li it } }
a( href:“’http://stupidedia.org/stupi/Graf_Zahl“‘,
‚Graf Zahl‘ )
}
}
}
println writer

Eigenschaften von Groovy mit Beispiel

Groovy-Skripte in Eclipse ausführen

Um Groovy-Skripte und Programme auszuführen, bieten sich drei Wege an:

  • über eine spezielle Kommandozeile, die Groovy-Shell
  • über das Eclipse-Plugin
  • über die javax.script-API

Das Eclipse-Plugin unter http://groovy.codehaus.org/Eclipse+Plugin leistet gute Arbeit und wird ständig weiterentwickelt. Auf der Webseite ist der Update-Link genannt, sodass Groovy-Eclipse über den Update-Manager installiert werden kann.

  1. Wähle dazu Eclipse Help • Install New Software…
  2. In der Dialogbox fülle das Textfeld bei Work with mit dem Link http://dist.springsource.org/release/GRECLIPSE/e4.3/ (bzw. anderen Versionen je nach Eclipse-Version), und aktiviere Add…
  3. Aktiviere anschließend Groovy-Eclipse, und führe die Installation mit Next usw. zu Ende.

Ist Eclipse neu gestartet und das Plugin installiert, kann jedes Java-Projekt um Groovy-Unterstützung erweitert werden. Bei einem Java-Projekt aktiviert die Aktion Configure • Convert to Groovy Project im Kontextmenü genau diese Groovy-Unterstützung, sodass im Projektbaum die Groovy-Bibliotheken auftauchen.

File • New • Other… ermöglicht zum einen im Zweig Groovy das Erstellen eines neuen Groovy-Projekts (durch die Konvertierung eines existierenden Java-Projekts ist das nicht mehr nötig) und zum anderen mit Groovy Class das Erstellen einer Groovy-Klasse. Bei dieser Option lässt sich ein Paket- und Klassenname eingeben (etwa com.tutego.insel.script und GroovyBabe), und dann öffnet Eclipse den Groovy-Editor.

Löschen wir die Klassendeklaration und setzen nur die zwei Zeilen in die Datei:

package com.tutego.insel.script

print „Hallo Groovy“

Ausgeführt wird das Groovy-Skript im Kontextmenü (oder Run-Menü) mit Run As • Groovy Skript.

Groovy über die Skript-API ausführen

Um Groovy als Skriptsprache aus einem Java-Programm heraus zu nutzen, können wir wieder auf die Skript-API zurückgreifen. Wenn es sich bei Eclipse schon um ein Groovy-Projekt handelt, ist ein JAR schon im Klassenpfad eingebunden, und es ist nichts zu tun. Andernfalls bekommen wir von der Webseite http://groovy.codehaus.org/Download unter Download zip: Binary Release ein fast 30 MiB großes ZIP-Archiv wie groovy-binary-2.2.2.zip, wo groovy-all-2.2.2.jar im Ordner embeddable liegt und das wir in den Klassenpfad mit aufnehmen.

Ein kleines Beispiel:

ScriptEngine engine = new ScriptEngineManager().getEngineByName( "groovy" );
 System.out.println( engine.eval( "(1g..42g.gcd(56g)).sum()" ) ); // 105
[1]    Bis auf sehr kleine Ausnahmen ist jedes Java-Programm ein Groovy-Programm.