Blog

Leistungsstarkes Groovy

Lars Vonk

Aktualisiert Oktober 23, 2025
3 Minuten

Für meine aktuelle Aufgabe muss ich ein Skript schreiben, das im Wesentlichen folgende Aufgaben übernimmt: Öffnen der War-Datei, Herunterladen und Hinzufügen von Dateien aus dem Internet, Entfernen von Dateien, Ändern von Xml- und Eigenschaftsdateien, Neupacken der War-Datei. In reinem Java wäre das ziemlich viel Arbeit, um es zu implementieren. Natürlich gibt es verschiedene Bibliotheken, die das Entpacken, Herunterladen usw. etwas einfacher machen. Aber trotzdem wäre es zu viel Aufwand für solch triviale Aufgaben.Da es sich tatsächlich um ein Skript handelt, das ich erstellen möchte, warum nicht eine Skriptsprache wie Groovy verwenden. Nach zwei Tagen der Programmierung muss ich sagen, dass ich mit den Fortschritten sehr zufrieden bin, wenn man bedenkt, dass dies meine erste echte Groovy-Programmiererfahrung ist. Hier sind einige Erfahrungen und der Code, den ich bisher erstellt habe:

IDE-Unterstützung Ich habe (früher) mit Eclipse gearbeitet, aber die Groovy-Unterstützung für Eclipse ist noch in Arbeit, was sich bei der Verwendung des Groovy Eclipse-Plugins bemerkbar machte. Meiner Erfahrung nach war es nicht wirklich brauchbar. Da ich von Eclipse bereits die Nase voll hatte, war dies der letzte Anstoß, den ich brauchte, um zu IntellJ zu wechseln. Kodierung Lassen Sie uns nun mit der Kodierung beginnen und sehen, wie Sie Zipping in Groovy implementieren können. Groovy hat den Standard-JDK-Klassen bereits eine Reihe von Komfortmethoden hinzugefügt. Aber wäre es nicht toll, wenn es in Java auch so etwas wie eine extractTo(destination)-Methode für ZipFile und eine Methode zip(destination) für File gäbe? Nun, mit Groovy können Sie dies ganz einfach selbst hinzufügen, indem Sie die MetaClass verwenden und sie in Ihrem Code verfügbar machen. So habe ich das Zippen hinzugefügt:

Klasse Bootstrapper {
  void boot() {
  File.metaClass.zip = { String destination ->
  def result = new ZipOutputStream(new FileOutputStream(destination))
  result.withStream {zipOutStream->
  delegate.eachFileRecurse { f ->
  if(!f.isDirectory()) {
  zipOutStream.putNextEntry(new ZipEntry(f.getPath()))
  new FileInputStream(f).withStream { inStream ->
  def buffer = new byte[1024]
  def count
  while((count = inStream.read(buffer, 0, 1024)) != -1) {
  zipOutStream.write(buffer)
  }
  }
  zipOutStream.closeEntry()
  }
  }
  }
  }
  }
}

Was mir wirklich sehr gut gefällt, sind die Closures für die Arbeit mit Streams... Keine try-catch-finally-try-finally-Blöcke mehr zum Schließen von Streams! Das ist etwas, das ich in Java wirklich vermisse. Um ein Verzeichnis zu schließen, können Sie jetzt einfach sagen:

new File("/home/lars/").zip("/tmp/home.zip");

Da ich mehrere Methoden zu den JDK-Klassen hinzugefügt habe, habe ich eine Bootstrapper-Klasse erstellt, die ich beim Starten meines Groovy-Hauptskripts lade. Auf diese Weise habe ich einen guten Überblick darüber, welche Methoden ich selbst hinzugefügt habe. Testen Eine weitere coole Sache in Groovy ist die eingebaute JUnit-Unterstützung. Sie können Unit-Tests erstellen, indem Sie GroovyTestCase erweitern. Und wenn das nicht ausreicht, sind Groovy-Testfälle sofort lauffähig, so dass Sie eine Testklasse einfach mit groovy com/xebia/ZipTest.groovy ausführen können. Fazit Nach nur zwei Tagen mit Groovy begann ich, es wirklich zu mögen. Einer der schönen Aspekte ist, dass Sie, wenn Sie nicht wissen, wie man es in Groovy macht, einfach Java verwenden und später eine groovyere Lösung finden können. Eine andere Sache, die mir aufgefallen ist, ist, dass die Codezeilen, die Sie mit Groovy produzieren, erheblich weniger sind als die Codezeilen, die es mit Java wären. Ganz zu schweigen von der Tatsache, dass ich für meinen Groovy-Code tatsächlich 0 Abhängigkeiten angegeben habe. Wie viele wären das bei Java gewesen?Und zusätzlich zum Groovy-Eis gibt Ihnen die Groovy-MetaClass ein sehr leistungsfähiges Werkzeug an die Hand, mit dem Sie ein intuitiveres Java erstellen können.Ich werde in meinen zukünftigen Projekten definitiv mehr Groovy verwenden.LarsPS. Alle Funktionen, die ich für dieses Skript benötigte, werden auch bereits vom eingebauten AntBuilder von Groovy angeboten.

Verfasst von

Lars Vonk

Contact

Let’s discuss how we can support your journey.