Windows-Executables mit Java
Heute hatte ich den seltsamen Fehler, dass das automatische Kopieren unseres Jar-Files cit2-ejb-yaaff-service-1.1.0.jar nach
10_cit2-ejb-yaaff-service-1.1.0.jar per Maven nicht mehr funktionierte. Ich bin mir nicht bewusst, was ich geändert habe, allerdings ist dieser Fehler auch schon bei Ute vor ca. einer Woche aufgetreten.
Die Interpretation der Fehlermeldung war etwa in dem Sinn, dass der Maven-Task gern ein executable hätte, derweil ist copy aber ein in der Shell eingebautes Kommando.
Nach einigem Suchen im Internet nach anderen Maven-Plugins beschloss ich die Sache selbst in die Hand zu nehmen und ein Windows-Executable zu erstellen, aus einem Java-Programm heraus natürlich.
Das Java-Programm war mit Hilfe der Klasse Runtime schnell geschrieben:
import java.io.IOException; public class Javacopy { public static void main(String[] args) { if (args.length < 2) { System.out.println("Two arguments expected!"); } else { try { Runtime.getRuntime().exec( new String[] { "cmd.exe", "/c", "copy", args[0], args[1] } ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
Es macht nichts anderes, als die Kommandozeilenargumente an copy weiterzuleiten, welches selbst per cmd /c gestartet wird.
Danach wurde Javacopy.java zu Javacopy.class kompiliert.
Der letzte Schritt zu einem unter Windows lauffähigem exe bestand darin, die Java-Klasse mittels eines Wrappers zu verpacken. Mit JSmoothGen hatte ich schonmal exe für Windows erstellt, dazu war aber eine Konfiguration nötig. Da nur ein .class-File zu verpacken war, suchte ich nach einem Kommandozeilentool und wurde bei Jexepack fündig.
Damit also schnell das exe erzeugt und im Windows-System32-Verzeichnis abgelegt. Nun musste nur noch das neue exe von Maven aus angesprochen werden. Der betreffende Ausschnitt der pom.xml ist dieser:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <id>copy-jar</id> <phase>package</phase> <goals> <goal>exec</goal> </goals> <configuration> <!-- executable>copy</executable --> <executable>Javacopy</executable> <arguments> <argument>${project.build.finalName}.jar</argument> <argument>${deployment.filename}</argument> </arguments> <workingDirectory>${project.build.directory}</workingDirectory> </configuration> </execution> </executions> </plugin>
Es wurde lediglich copy durch Javacopy ersetzt (natürlich nur im Windows-Profil 🙂 ).