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.
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?
Verfasst von
Lars Vonk
Unsere Ideen
Weitere Blogs
Contact



