Blog

Groovy und Java kombinieren

Erik Pragt

Aktualisiert Oktober 23, 2025
5 Minuten

Groovy und Java kombinieren

Jeder macht Refactoring (hoffe ich). Aber was, wenn Ihr Standard-Refactoring einfach nicht gut genug ist? Machen Sie den nächsten Schritt beim Refactoring in Groovy-Code und sehen Sie, wie einfach es ist, Groovy in Ihre bestehenden Java-Projekte zu integrieren.

Die Herausforderung

Bei der Arbeit an einem Projekt bin ich kürzlich auf den folgenden Code gestoßen (so ähnlich):

// Die Ergebnisliste
ArrayList Ergebnis = new ArrayList();
// Zuerst erstellen wir ein Dokument auf der Grundlage einer URL
URL url = new URL(configLocation);
URLConnection connection = url.getConnection();
InputStream in = connection.getInputStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Dokument document = builder.parse(inputStream);
// ... dann machen Sie einige XPath-Abfragen
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
NodeList nodeList = (NodeList) xpath.evaluate("/user/address", document, XPathConstants.NODESET);
// Und Schleife durch die Ergebnisse
for (int i = 0; i  <  nodeList.getLength(); i++) {
  final Node node = nodeList.item(i);
  XPath xpath = XPathFactory.newInstance().newXPath();
  // Lesen von Parametern aus der XML-Datei mit XPath
  String name = (String) xpath.evaluate("name", node, XPathConstants.STRING);
  result.add(name);
}

Zunächst versucht dieser Code, von einer URL zu lesen, um eine XML-Datei abzurufen. Dann versucht er, einige XPath-Abfragen auszuführen, um eine NodeList abzurufen, und für jedes Element in der NodeList fügt er ein Element zu einer Ergebnisliste hinzu. Ich habe die Fehlerbehandlung weggelassen, weil das Codebeispiel dadurch noch länger geworden wäre. Wie Sie vielleicht zustimmen werden, ist der obige Code ziemlich schwer zu lesen und verursacht eine Menge Overhead bei dem Versuch, die gestellte Aufgabe zu erfüllen. Obwohl dieser Code wahrscheinlich optimiert und erheblich verkürzt werden könnte, dachte ich, dass dieser Code hässlich genug war, um ihn komplett zu ersetzen. Ich habe meine Optionen überdacht und bin zu dem Schluss gekommen, dass es eine gute Übung wäre, ein wenig Groovy zu verwenden, um das XML-Parsing für mich zu erledigen und den aktuellen Java-Code durch Groovy-Code zu ersetzen, ohne dass die Funktionalität darunter leidet. Für diejenigen, die mit Groovy überhaupt nicht vertraut sind, empfehle ich, die Groovy-Website zu besuchen. Sie enthält eine umfangreiche Dokumentation und Code-Beispiele. Kurz gesagt, Groovy ist eine dynamische Skriptsprache. Es ist keine Portierung wie JRuby, sondern wurde speziell für die Arbeit mit Java entwickelt. Um den Code zu ersetzen, musste ich dafür sorgen, dass er funktioniert:

  1. Bieten Sie danach das gleiche Maß an Funktionalität
  2. Weniger Gemeinkosten haben
  3. Würde sich in unser Build-System (Maven 2) integrieren

Die Lösung

Lassen Sie uns also bei Punkt 1 beginnen. Wir brauchen ein wenig Groovy-Code, um eine URL zu laden, XML zu parsen und daraus einige Java-Objekte zu erstellen. Der folgende Code tut genau das:

Paket groovy
import com.xebia.domain.Address
import com.xebia.domain.AddressDownloader
class GroovyAddressDownloader implements AddressDownloader {
  // Implementieren Sie die Methode genau wie in Java
  public Liste herunterladen() {
  // Definieren Sie den Ort der Quell-URL
  def url = "https://www.foobar.com/address.xml"
  // Verwenden Sie den automatisch importierten groovy.util.XmlParser
  // zum Parsen der Quelle
  def xmlFeed = new XmlParser().parse(url);
  // eine neue Liste erstellen
  def list = []
  // Schleife durch alle Xml-Elemente mit dynamischen Methoden
  xmlFeed.address.each {item ->
  // Abrufen des Inhalts des Elements root/address/name
  def wert = artikel.name.text()
  // Erstellen Sie eine neue Adresse mit einem dynamischen Konstruktor
  // und fügen Sie sie der Liste hinzu
  Liste  <<  new Adresse(Name: Wert);
  }
  Rückgabeliste
  }
}

Wie Sie sehen, ist das obige Beispiel, auch wenn es zu 50% aus Kommentaren besteht, immer noch kürzer und vollständiger als die Java-Version. Der Groovy-Code ist sehr konsistent und bietet fast keinen Overhead beim Parsen des XML. Das obige Beispiel verwendet einige Groovy-Magie, wie Closures, dynamische Methoden, Shorthand-Methoden, usw.

Es zum Laufen bringen

Wenn ich das Folgende in meiner Lieblings-IDE eingebe:

import groovy.GroovyAddressDownloader;
AddressDownloader addressDownloader = new GroovyAddressDownloader();
Liste Adressen = addressDownloader.download();

Und drücken Sie STRG+SHIFT+F10 (Ausführen), es funktioniert! IntelliJ 7.0 unterstützt Groovy (und Grails) von Haus aus und bietet viele der Funktionen, an die Java-Entwickler heutzutage gewöhnt sind (Syntaxhervorhebung, Code-Vervollständigung, Refactoring usw.), sehr gut an.

Integration mit Maven

Aber so weit sind wir noch nicht! Wir verwenden nicht IntelliJ als Build, sondern Maven 2. Zum Glück für uns wurde Anfang Dezember eine neue Version des Groovy Maven Plugin veröffentlicht. Dieses Plugin macht es einfach, Java, Groovy oder eine Kombination aus beiden in einem Projekt zu kompilieren. Dazu müssen wir lediglich unsere Maven pom.xml so bearbeiten, dass sie das Groovy-Plugin enthält, und die settings.xml so ändern, dass sie das codehaus-Repository enthält. Die folgenden XML-Zeilen müssen der pom.xml hinzugefügt werden:


  org.codehaus.mojo.groovy
  groovy-maven-plugin

  generateStubs
  kompilieren

Eine kleine Erklärung aus dem Groovy Maven Plugin:

Es funktioniert durch Hinzufügen einer zusätzlichen Zielausführung zur Erzeugung von Stubs während der Phasen generate-sources und generate-test-sources. Diese Stubs werden aus Ihren Groovy-Quelldateien erstellt und in minimale Java-Quellen übersetzt (die JavaDoc, Klassen, Felder, Methoden usw. enthalten, aber die Implementierungsdetails weglassen). Auf diese Weise kann das maven-compiler-plugin von Maven ganz normal aufgerufen werden, um die Java-Quellen und die Groovy-Java-Stubs zu kompilieren, so dass die Kompilierung die Klassen auflösen kann. Nach der normalen Java-Kompilierung schaltet sich der Groovy-Compiler ein und generiert dann die echten Klassen an den richtigen Stellen und alles ist glücklich. Kurz gesagt: Dies stellt sicher, dass Ihr Java-Code den Groovy-Code verwenden kann und umgekehrt.

Nachdem Sie die letzten XML-Zeilen zu unseren Einstellungen hinzugefügt haben (zu finden in Ihrem Home-Verzeichnis/.m2):



  codehaus

  Codehaus
 
https://repository.codehaus.org/

  false

  true

  Codehaus
 
https://repository.codehaus.org/

  false

  true

  Codehaus

Sie sollten nun startklar sein. Wenn Sie mvn install ausführen, sollten sowohl Ihre Java- als auch Ihre Groovy-Klassen kompiliert werden, und wenn alles geklappt hat, sollten Sie in der Maven-Ausgabe etwas wie dieses sehen: [INFO] [groovy:generateStubs {execution: default}] [INFO] Generated 1 Java stub [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Compiling 1 source file to D:ProjectsGroovyDemottargetclasses [INFO] [groovy:compile {execution: default}] [INFO] Compiled 2 Groovy source files [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources.

Fazit

Es ist nicht schwer, Groovy in Kombination mit Ihrem bestehenden Java-Projekt zum Laufen zu bringen. Laden Sie also Groovy herunter, lesen Sie die Dokumentation und probieren Sie es aus!

Verfasst von

Erik Pragt

Contact

Let’s discuss how we can support your journey.