Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

Standalone Java Applikationen mit Maven

Das Bauen und Ausliefern von nor­ma­len und eigen­stän­di­gen Java Anwendungen die nicht in einem Webcontainer oder Applikationserver lau­fen sol­len kann sich als schwie­rig erwei­sen. Die größ­ten Probleme beim Erzeugen der Releases sind dabei die fol­gen­den Punkte:

  • es müs­sen die benö­tig­ten Bibliotheken auf­ge­löst und mit in des Release gepackt werden
  • die Java Applikation muss in den meis­ten Fällen auf dem Zielsystem als Dienst lau­fen (Deamon)
  • das Erstellen und Packen des Releases sollte auto­ma­ti­siert erfolgen

Das Maven 2 Plugin appas­sem­bler zielt auf die­sen Anwendungsfall ab und ermöglicht

  • das auto­ma­ti­sierte Erstellen von Skripten zur ein­fa­chen Ausführung der Applikation
  • das Erzeugen von Releases die es ermög­li­chen, die Java Anwendung als Dienst zu betreiben
  • die Erzeugung von Repositories die alle nöti­gen Bibliotheken für die Anwendung enthalten.

Die Konfiguration des Plugins ist aber lei­der nicht ganz so ein­fach da die Dokumentation eher schlecht ist und ich auch auf Bugs im Plugin sel­ber gesto­ßen bin. 

Im Folgenden ist  eine Konfiguration als Beispiel auf­ge­lis­tet die eine Deamonapplikation erzeugt.  Um die Applikation als Dienst betrei­ben zu kön­nen wird vom Plugin  der weit ver­brei­tete 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 aus­zu­füh­rende Klasse.
commandLineArguments Parameter die beim Aufruf mit über­ge­ben wer­den sollen.
plat­forms Die Liste der Plattformen für die ein Release erzeugt wer­den soll, hier "jsw" (Java Service Wrapper).
jvmSettings Faßt Konfigurationsparameter für die Java VM zusam­men wie z.B. Speichereinstellungen, zusätz­li­che System Properties die gesetzt wer­den sol­len oder Parameter für den Aufruf der VM
inclu­des Ermöglicht die optio­nale Definition der Zielumgebungen, hier linux 32 und 64 bit, kann auch weg­ge­las­sen werden.
configuration.directory.in.classpath.first Legt fest, dass ein bestimm­tes Verzeichnis mit in den Classpath der VM auf­ge­nom­men wird. Darin las­sen sich gut Konfigurationsdateien able­gen 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 aus­ge­führt wer­den soll, wich­tig 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 kon­fi­gu­rie­ren das Zielverzeichnis für das zu erstel­lende Repository. Leider wird bei den Standardwerten das Repository in einem ande­ren 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 defi­nier­ten Deamons und ein Library Repository mit allen Abhängigkeiten des Projekts.

Related Posts

Pin It on Pinterest