Das Bauen und Ausliefern von normalen und eigenständigen Java Anwendungen die nicht in einem Webcontainer oder Applikationserver laufen sollen kann sich als schwierig erweisen. Die größten Probleme beim Erzeugen der Releases sind dabei die folgenden Punkte:
- es müssen die benötigten Bibliotheken aufgelöst und mit in des Release gepackt werden
- die Java Applikation muss in den meisten Fällen auf dem Zielsystem als Dienst laufen (Deamon)
- das Erstellen und Packen des Releases sollte automatisiert erfolgen
Das Maven 2 Plugin appassembler zielt auf diesen Anwendungsfall ab und ermöglicht
- das automatisierte Erstellen von Skripten zur einfachen Ausführung der Applikation
- das Erzeugen von Releases die es ermöglichen, die Java Anwendung als Dienst zu betreiben
- die Erzeugung von Repositories die alle nötigen Bibliotheken für die Anwendung enthalten.
Die Konfiguration des Plugins ist aber leider nicht ganz so einfach da die Dokumentation eher schlecht ist und ich auch auf Bugs im Plugin selber gestoßen bin.
Im Folgenden ist eine Konfiguration als Beispiel aufgelistet die eine Deamonapplikation erzeugt. Um die Applikation als Dienst betreiben zu können wird vom Plugin der weit verbreitete Java Service Wrapper eingesetzt.
Beispielkonfiguration
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <configuration> <repositoryLayout>flat</repositoryLayout> <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath> <target>${project.build.directory}/appassembler</target> <daemons> <daemon> <id>daemon-app</id> <mainClass>de.communardo.appassembler.Launcher</mainClass> <commandLineArguments> <commandLineArgument>start</commandLineArgument> </commandLineArguments> <platforms> <platform>jsw</platform> </platforms> <jvmSettings> <extraArguments> <extraArgument>-server</extraArgument> </extraArguments> <initialMemorySize>64M</initialMemorySize> <maxMemorySize>512M</maxMemorySize> <systemProperties> <systemProperty>property=value</systemProperty> </systemProperties> </jvmSettings> <generatorConfigurations> <generatorConfiguration> <generator>jsw</generator> <includes> <include>linux-x86-32</include> <include>linux-x86-64</include> </includes> <configuration> <property> <name>configuration.directory.in.classpath.first</name> <value>conf</value> </property> <property> <name>set.default.REPO_DIR</name> <value>lib</value> </property> <property> <name>wrapper.logfile</name> <value>logs/wrapper.log</value> </property> <property> <name>wrapper.logfile.maxsize</name> <value>10m</value> </property> <property> <name>wrapper.logfile.maxfiles</name> <value>5</value> </property> <property> <name>wrapper.console.title</name> <value>appassembler application</value> </property> <property> <name>run.as.user.envvar</name> <value>root</value> </property> <property> <name>wrapper.working.dir</name> <value>d:\</value> </property> <property> <name>set.default.APP_BASE</name> <value>d:\</value> </property> </configuration> </generatorConfiguration> </generatorConfigurations> </daemon> </daemons> </configuration> <executions> <execution> <id>create-release</id> <goals> <goal>create-repository</goal> <goal>generate-daemons</goal> </goals> <configuration> <assembleDirectory>${project.build.directory}/appassembler/jsw/daemon-app</assembleDirectory> <repoPath>lib</repoPath> </configuration> <phase>package</phase> </execution> </executions> </plugin>
Parameter
mainClass | Die auszuführende Klasse. |
commandLineArguments | Parameter die beim Aufruf mit übergeben werden sollen. |
platforms | Die Liste der Plattformen für die ein Release erzeugt werden soll, hier "jsw" (Java Service Wrapper). |
jvmSettings | Faßt Konfigurationsparameter für die Java VM zusammen wie z.B. Speichereinstellungen, zusätzliche System Properties die gesetzt werden sollen oder Parameter für den Aufruf der VM |
includes | Ermöglicht die optionale Definition der Zielumgebungen, hier linux 32 und 64 bit, kann auch weggelassen werden. |
configuration.directory.in.classpath.first | Legt fest, dass ein bestimmtes Verzeichnis mit in den Classpath der VM aufgenommen wird. Darin lassen sich gut Konfigurationsdateien ablegen die von der Applikation beim Betrieb gebraucht werden. |
set.default.REPO_DIR | Das Verzeichnis in denen sich die Bibliotheken befinden. |
run.as.user.envvar | Der Nutzer mit dem die Applikation ausgeführt werden soll, wichtig beim Betrieb in Linuxumgebungen. |
wrapper.xxx | Einstellungen für den Java Service Wrapper wie z.b. das Arbeitsverzeichnis, Anzahl der Logfiles usw. |
assembleDirectory, repoPath | Diese Parameter konfigurieren das Zielverzeichnis für das zu erstellende Repository. Leider wird bei den Standardwerten das Repository in einem anderen Verzeichnis erzeugt als der Java Service Wrapper, daher ist eine Anpassung nötig. |
<goals> <goal>create-repository</goal> <goal>generate-daemons</goal> </goals> |
Erzeugt die definierten Deamons und ein Library Repository mit allen Abhängigkeiten des Projekts. |