Een uitvoerbare JAR maken met Maven

1. Inleiding

In dit korte artikel zullen we ons concentreren op een Maven-project verpakken in een uitvoerbaar Jar-bestand.

Meestal bij het maken van een pot bestand, we willen het gemakkelijk uitvoeren, zonder de IDE te gebruiken; met dat doel bespreken we de configuratie en de voor- en nadelen van het gebruik van elk van deze benaderingen voor het maken van het uitvoerbare bestand.

2. Configuratie

Om een ​​uitvoerbaar pot, hebben we geen extra afhankelijkheden nodig. We hoeven alleen een Maven Java-project te maken en ten minste één klasse te hebben met de hoofd(…) methode.

In ons voorbeeld hebben we de Java-klasse gemaakt met de naam Uitvoerbaar bestand MavenJar.

We moeten er ook voor zorgen dat onze pom.xml bevat de volgende elementen:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT-pot

Het belangrijkste aspect hier is het type - om een ​​uitvoerbaar bestand te maken pot, controleer nogmaals of de configuratie een pot type.

Nu kunnen we de verschillende oplossingen gaan gebruiken.

2.1. Handmatige configuratie

Laten we beginnen met een handmatige aanpak - met behulp van de maven-afhankelijkheid-plugin.

Eerst kopiëren we alle vereiste afhankelijkheden naar de map die we zullen specificeren:

 org.apache.maven.plugins maven-dependency-plugin kopieerafhankelijkheden prepareer-pakket kopieerafhankelijkheden $ {project.build.directory} / libs 

Er zijn twee belangrijke aspecten om op te merken. Eerst specificeren we het doel kopie-afhankelijkheden, die Maven vertelt om deze afhankelijkheden naar het opgegeven outputDirectory.

In ons geval maken we een map met de naam libs, in de project build directory (meestal de doelwit map).

In de tweede stap gaan we bewust een uitvoerbaar bestand en klassenpad maken pot, met de link naar de afhankelijkheden die in de eerste stap zijn gekopieerd:

 org.apache.maven.plugins maven-jar-plugin true libs / com.baeldung.executable.ExecutableMavenJar 

Het belangrijkste onderdeel van bovengenoemde is de manifesteren configuratie. We voegen een klassenpad toe, met alle afhankelijkheden (folder libs /), en geef de informatie over de hoofdklasse.

Houd er rekening mee dat we de volledig gekwalificeerde naam van de klasse moeten opgeven, wat betekent dat deze de pakketnaam bevat.

De voor- en nadelen van deze aanpak zijn:

  • voors - transparant proces, waar we elke stap kunnen specificeren
  • nadelen - handleiding, afhankelijkheden zijn uit de finale pot, wat betekent dat uw uitvoerbare pot werkt alleen als het libs map zal toegankelijk en zichtbaar zijn voor een pot

2.2. Apache Maven Assembly-plug-in

Met de Apache Maven Assembly-plug-in kunnen gebruikers de projectuitvoer samen met de afhankelijkheden, modules, sitedocumentatie en andere bestanden samenvoegen tot een enkel uitvoerbaar pakket.

Het belangrijkste doel van de montage-plug-in is het single doel - wordt gebruikt om alle samenstellingen te maken (alle andere doelen zijn verouderd en zullen in een toekomstige release worden verwijderd).

Laten we de configuratie eens bekijken in pom.xml:

 org.apache.maven.plugins maven-assembly-plugin pakket enkele com.baeldung.executable.ExecutableMavenJar jar-met-afhankelijkheden 

Net als bij de handmatige benadering, moeten we de informatie over de hoofdklasse verstrekken; het verschil is dat de Maven Assembly-plug-in automatisch alle vereiste afhankelijkheden naar een pot het dossier.

In de descriptorRefs een deel van de configuratiecode hebben we de naam opgegeven, die zal worden toegevoegd aan de projectnaam.

Uitvoer in ons voorbeeld krijgt de naam core-java-jar-met-afhankelijkheden.jar.

  • voors - afhankelijkheden binnen het pot bestand, slechts één bestand
  • nadelen - basiscontrole van het verpakken van uw artefact, er is bijvoorbeeld geen ondersteuning voor verhuizing van klassen

2.3. Apache Maven Shade-plug-in

Apache Maven Shade Plugin biedt de mogelijkheid om het artefact in een uber-pot, dat bestaat uit alle afhankelijkheden die nodig zijn om het project uit te voeren. Bovendien ondersteunt het arcering - d.w.z. hernoemen - van de pakketten van enkele van de afhankelijkheden.

Laten we de configuratie eens bekijken:

 org.apache.maven.plugins maven-shad-plugin schaduw waar com.baeldung.executable.ExecutableMavenJar 

Er zijn drie hoofdonderdelen van deze configuratie:

Eerste, markeert alle afhankelijkheden die in het pot.

Ten tweede moeten we de implementatie van de transformator specificeren; we hebben de standaard gebruikt in ons voorbeeld.

Ten slotte moeten we de hoofdklasse van onze applicatie specificeren.

Het uitvoerbestand krijgt de naam core-java-0.1.0-SNAPSHOT-shaded.jar, waar core-java is onze projectnaam, gevolgd door de snapshotversie en de naam van de plug-in.

  • voors - afhankelijkheden binnen het pot bestand, geavanceerde controle over het verpakken van uw artefact, met arcering en klasseverplaatsing
  • nadelen - complexe configuratie (vooral als we geavanceerde functies willen gebruiken)

2.4. Eén Jar Maven-plug-in

Een andere optie om een ​​uitvoerbaar bestand te maken pot is het One Jar-project.

Dit biedt een aangepaste classloader die weet hoe klassen en bronnen moeten worden geladen vanuit jars in een archief, in plaats van vanuit potten in het bestandssysteem.

Laten we de configuratie eens bekijken:

 com.jolira onejar-maven-plugin org.baeldung.executable. ExecutableMavenJar true $ {project.build.finalName}. $ {Project.packaging} één jar 

Zoals het wordt getoond in de configuratie, moeten we de hoofdklasse specificeren en alle afhankelijkheden koppelen om te bouwen, met behulp van attachToBuild= waar.

We moeten ook de bestandsnaam van de uitvoer opgeven. Bovendien is het doel voor Maven een potje. Houd er rekening mee dat One Jar een commerciële oplossing is, die afhankelijkheid maakt potten tijdens runtime niet uitgebreid naar het bestandssysteem.

  • voors - schoon delegatiemodel, laat klassen op het hoogste niveau van de One Jar staan, ondersteunt extern potten en kan native bibliotheken ondersteunen
  • nadelen - niet actief ondersteund sinds 2012

2.5. Spring Boot Maven-plug-in

Ten slotte is de laatste oplossing die we zullen bekijken de Spring Boot Maven-plug-in.

Dit maakt het mogelijk om een ​​uitvoerbaar bestand te verpakken pot of oorlog archiveert en start een applicatie "in-place".

Om het te gebruiken hebben we minimaal Maven versie 3.2 nodig. De gedetailleerde beschrijving is hier beschikbaar.

Laten we eens kijken naar de configuratie:

 org.springframework.boot spring-boot-maven-plugin herverpakking spring-boot com.baeldung.executable.ExecutableMavenJar 

Er zijn twee verschillen tussen de Spring-plug-in en de andere. Ten eerste wordt het doel van de executie genoemd herverpakken, en de classifier is genoemd veerboot.

Houd er rekening mee dat we geen Spring Boot-applicatie nodig hebben om deze plug-in te gebruiken.

  • voors - afhankelijkheden binnen een pot bestand, kunt u het op elke toegankelijke locatie uitvoeren, geavanceerde controle over het verpakken van uw artefact, met uitsluiting van afhankelijkheden van het pot bestand etc., verpakking van oorlog bestanden ook
  • nadelen - voegt mogelijk onnodige Spring- en Spring Boot-gerelateerde klassen toe

2.6. Webapplicatie met uitvoerbare Tomcat

In het laatste deel willen we het hebben over het hebben van een zelfstandige webapplicatie, verpakt in een jar het dossier. Om dat te doen, hebben we een andere plug-in nodig, ontworpen voor het maken van uitvoerbare jar-bestanden:

 org.apache.tomcat.maven tomcat7-maven-plugin 2.0 tomcat-run exec-war-only pakket / false webapp.jar utf-8 

De doel is ingesteld als exec-war-only, pad naar uw server is binnen gespecificeerd configuratie tag, met aanvullende eigenschappen, zoals finalName, karakterset etc. Om een ​​j te bouwenar, rennen man-pakket, wat zal resulteren in het creëren van webapp.jar in uw doelwit directory. Rennen

Om de applicatie uit te voeren, schrijft u dit gewoon in uw console: java -jar doel / webapp.jar en probeer het te testen door de localhost: 8080/ in een browser.

  • voors - met één bestand, eenvoudig te implementeren en uit te voeren
  • nadelen - de grootte van het bestand is veel groter, omdat de ingesloten Tomcat-distributie in een war het dossier

Houd er rekening mee dat dit de nieuwste versie is van deze plug-in, die de Tomcat7-server ondersteunt. Om fouten te voorkomen, moet u controleren of uw afhankelijkheid voor Servlets reikwijdte ingesteld als voorzien, anders ontstaat er een conflict bij de looptijd van uitvoerbaar pot:

 javax.servlet javax.servlet-api voorzien 

3. Conclusie

In dit artikel hebben we veel manieren beschreven om een ​​uitvoerbaar bestand te maken pot met verschillende Maven-plug-ins.

De volledige implementatie van deze tutorial is te vinden in deze (executable jar) en deze (executable war) Github-projecten.

Hoe te testen? Om het project te compileren in een uitvoerbaar bestand pot, voer Maven alsjeblieft uit mvn schoon pakket opdracht.

Hopelijk geeft dit artikel u wat meer inzichten over het onderwerp en vindt u uw voorkeursbenadering afhankelijk van uw behoeften.

Een snelle laatste opmerking: zorg ervoor dat de licenties van de potten die u bundelt dit soort bewerkingen niet verhinderen. Over het algemeen zal dat niet het geval zijn, maar het is het overwegen waard.