Uitvoerbare JAR bestanden met Maven

 
19 september 2008

Met Maven is het zeer eenvoudig om JAR bestanden uitvoerbaar te maken.

Voor mensen die nog geen ervaring hebben met Maven; lees eerst even de 5 minuten tutorial of kijk naar een eerdere post van mij.
In Maven is alles een plugin. Plugins zijn te configureren dus ook om de archiver plugin. De archiver plugin is word simpelweg geconfigureerd met de XML element:

<packaging>jar</packaging>

Door jar aan te geven zal de maven-jar-plugin gebruikt worden. Zo zal war de maven-war-plugin activeren. Overigens is pom hier een bijzondere instelling. Dit geeft aan dat het project geen code heeft maar een project container. Dit wordt alleen gebruikt in een multi-module omgeving.

De JAR plugin configureren
In de root van de POM bevind zich de build element. Hierin worden de plugins geconfigureerd. Hierin specificeert men alles wat met het bouwen te maken heeft.

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <configuration>
            <archive>
               <manifest>
                  <mainClass>nl.sogyo.demo.Demo</mainClass>
               </manifest>
            </archive>
         </configuration>
      </plugin>
   </plugins>
</build>

Dit stukje configuratie zal er voor zorgen dat er binnen de JAR een META-INF directory zal worden aangemaakt met daarin de manifest met de juiste instellingen.
Om het programma te starten zullen we nu iets moeten tikken als:
java -cp lib/dependency1.jar;lib/dependency2.jar -jar program.jar
Of voor mensen met Windows:
java -cp lib\dependency1.jar:lib\dependency2.jar -jar program.jar

Dependencies
Nu is de JAR uitvoerbaar maar hebben we nog een probleem: als we het programma uitvoeren moeten we nog steeds een CLASSPATH opgeven voor de dependencies. Dit kunnen we ook vereenvoudigen.
We moeten de JAR plugin ook nog eens vertellen waar alle dependencies te vinden zijn.

<build>
   <plugins>
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <configuration>
            <archive>
               <manifest>
                  <classpathPrefix>lib/</classpathPrefix>
                  <addClasspath>true</addClasspath>
                  <mainClass>nl.sogyo.demo.Demo</mainClass>
               </manifest>
            </archive>
         </configuration>
      </plugin>
   </plugins>
</build>

Zoals je ziet heb ik in dit stuk twee regels toegevoegd: Een optie om te vertellen dat alle dependencies opgenomen moeten worden in de JAR én vermeld moeten worden in het manifest. Ook hebben we een optie toegevoegd die een relatief pad opneemt om aan te geven waar de dependencies te vinden zijn.

De dependencies kopiëren
Nu moeten we nog alle dependencies op de juiste plek zetten: in de lib directory. Zoals we hebben gespecificeerd in de JAR plugin.
We voegen de volgende plugin toe aan onder de JAR plugin:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-dependency-plugin</artifactId>
   <executions>
      <execution>
         <id>copy-dependencies</id>
         <phase>package</phase>
         <goals>
            <goal>copy-dependencies</goal>
         </goals>
         <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>false</overWriteSnapshots>
            <overWriteIfNewer>true</overWriteIfNewer>
         </configuration>
      </execution>
   </executions>
</plugin>

De dependency plugin zal alle dependencies die opgenomen zijn in de POM kopiëren tijdens het inpakken. Let wel: deze worden niet in de JAR mee genomen maar komen er naast te staan in de directory lib.
Nu kan het programma uitgevoerd worden met het volgende commando:
java -jar program.jar
(Dit command is overigens het zelfde onder Windows en Linux).
En de JAR bestanden waar deze programma gebruik van maakt in de lib directory kunnen automatisch gevonden worden via de manifest in de JAR.

Als je hier nieuw bent, wil je je misschien inschrijven voor onze RSS feed.
Bedankt voor je bezoek!

Gerelateerde bijdragen


Werken met Ivo Limmen?
Kijk dan bij onze mogelijkheden voor starters en/of ervaren IT'ers.


Categorieën: Deployment, Development, Java (EE)

Tags: , , , ,


Reactie

  • Rob Schlüter schreef:

    Bedankt, dit door Maven laten genereren is veel eenvoudiger dan het classpath zelf in batch files up-to-date houden. Precies wat ik nodig had.

    Geplaatst op 03 december 2008 om 22:26 Permalink

Plaats een reactie

Jouw emailadres wordt nooit gepubliceerd of gedeeld. Benodigde velden zijn met * gemarkeerd.