Cum să creați un JAR executabil cu Maven

1. Introducere

În acest articol rapid ne vom concentra pe ambalarea unui proiect Maven într-un fișier Jar executabil .

De obicei, atunci când creăm un fișier jar , vrem să-l executăm cu ușurință, fără a utiliza IDE; în acest scop, vom discuta despre configurația și argumentele pro / contra utilizării fiecăreia dintre aceste abordări pentru crearea executabilului.

2. Configurare

Pentru a crea un jar executabil , nu avem nevoie de dependențe suplimentare. Trebuie doar să creăm un proiect Java Maven și să avem cel puțin o clasă cu metoda principală (...) .

În exemplul nostru, am creat clasa Java numită ExecutableMavenJar.

De asemenea, trebuie să ne asigurăm că pom.xml conține următoarele elemente:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

Cel mai important aspect aici este tipul - pentru a crea un jar executabil , verificați de două ori dacă configurația utilizează un tip jar .

Acum putem începe să folosim diferitele soluții.

2.1. Configurare manuală

Să începem cu o abordare manuală - cu ajutorul maven-dependency-plugin .

Mai întâi, vom copia toate dependențele necesare în folderul pe care îl vom specifica:

 org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies    ${project.build.directory}/libs     

Există două aspecte importante de remarcat. Mai întâi, specificăm obiectivul -dependențe de copiere , care îi spune lui Maven să copieze aceste dependențe în directorul de ieșire specificat .

În cazul nostru, vom crea un folder numit libs , în directorul de construire a proiectului (care este de obicei folderul țintă ).

În al doilea pas, vom crea un jar executabil și conștient de calea clasei , cu linkul către dependențe copiat în primul pas:

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

Cea mai importantă parte a celor menționate mai sus este configurația manifest . Adăugăm un classpath, cu toate dependențele (folder libs / ), și oferim informații despre clasa principală.

Vă rugăm să rețineți că trebuie să oferim un nume complet calificat din clasă, ceea ce înseamnă că va include numele pachetului.

Avantajele și dezavantajele acestei abordări sunt:

  • pro - proces transparent, unde putem specifica fiecare pas
  • contra - manual, dependențele sunt în afara jarului final , ceea ce înseamnă că jarul executabil va rula numai dacă folderul libs va fi accesibil și vizibil pentru un jar

2.2. Plugin de asamblare Apache Maven

Plugin-ul de asamblare Apache Maven permite utilizatorilor să agregeze rezultatul proiectului împreună cu dependențele, modulele, documentația site-ului și alte fișiere într-un singur pachet rulabil.

Scopul principal al pluginului de asamblare este un singur scop - utilizat pentru a crea toate ansamblurile (toate celelalte obiective sunt învechite și vor fi eliminate într-o versiune viitoare).

Să aruncăm o privire asupra configurației din pom.xml :

 org.apache.maven.plugins maven-assembly-plugin   package  single      com.baeldung.executable.ExecutableMavenJar     jar-with-dependencies     

În mod similar cu abordarea manuală, trebuie să oferim informații despre clasa principală; diferența este că Maven Assembly Plugin va copia automat toate dependențele necesare într-un fișier jar .

În partea descriptorRefs a codului de configurare, am furnizat numele, care va fi adăugat la numele proiectului.

Rezultatul din exemplul nostru va fi denumit core-java-jar-with-dependencies.jar.

  • profesioniști - dependențe din fișierul jar , un singur fișier
  • contra - controlul de bază al ambalării artefactului dvs., de exemplu, nu există suport pentru relocarea clasei

2.3. Plugin Apache Maven Shade

Apache Maven Shade Plugin oferă capacitatea de a împacheta artefactul într-un uber-jar , care constă din toate dependențele necesare pentru a rula proiectul. Mai mult, acceptă umbrirea - adică redenumirea - pachetelor unor dependențe.

Să aruncăm o privire asupra configurației:

 org.apache.maven.plugins maven-shade-plugin    shade   true   com.baeldung.executable.ExecutableMavenJar      

Există trei părți principale ale acestei configurații:

Primul, marchează toate dependențele care trebuie ambalate în borcan .

În al doilea rând, trebuie să specificăm implementarea transformatorului; l-am folosit pe cel standard în exemplul nostru.

În cele din urmă, trebuie să specificăm clasa principală a aplicației noastre.

Fișierul de ieșire va fi denumit core-java-0.1.0-SNAPSHOT-shaded.jar , unde core-java este numele proiectului nostru, urmat de versiunea instantanee și numele pluginului.

  • profesioniști - dependențe în interiorul fișierului jar , control avansat al ambalării artefactului dvs., cu umbrire și relocare a clasei
  • contra - configurație complexă (mai ales dacă dorim să folosim funcții avansate)

2.4. Un plugin Jar Maven

O altă opțiune pentru crearea unui jar executabil este proiectul One Jar.

Aceasta oferă încărcător de clasă personalizat care știe cum să încarce clase și resurse din borcane în interiorul unei arhive, în loc de din borcane în sistemul de fișiere.

Să aruncăm o privire asupra configurației:

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

Așa cum se arată în configurație, trebuie să specificăm clasa principală și să atașăm toate dependențele de construit, utilizând attachToBuild = true .

Also, we should provide the output filename. Moreover, the goal for Maven is one-jar. Please note, that One Jar is a commercial solution, that will make dependency jars not expanded into the filesystem at runtime.

  • pros – clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
  • cons – not actively supported since 2012

2.5. Spring Boot Maven Plugin

Finally, the last solution we'll look at is the Spring Boot Maven Plugin.

This allows to package executable jar or war archives and run an application “in-place”.

To use it we need to use at least Maven version 3.2. The detailed description is available here.

Let's have a look at the config:

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

There are two differences between Spring plugin and the others. First, the goal of the execution is called repackage, and the classifier is named spring-boot.

Please note, that we don't need to have Spring Boot application in order to use this plugin.

  • pros – dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well
  • cons – adds potentially unnecessary Spring and Spring Boot related classes

2.6. Web Application With Executable Tomcat

In the last part, we want to cover the topic of having a standalone web application, that is packed inside a jar file. In order to do that, we need to use different plugin, designed for creating executable jar files:

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

The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run

To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.

  • pros – having one file, easy to deploy and run
  • cons – a size of the file is much larger, due to packing Tomcat embedded distribution inside a war file

Please note, that this is the latest version of this plugin, which supports Tomcat7 server. To avoid errors, please check that your dependency for Servlets has scope set as provided, otherwise, there will be a conflict at the runtime of executable jar:

 javax.servlet javax.servlet-api provided 

3. Conclusion

În acest articol, am descris multe modalități de a crea un jar executabil cu diferite plugin-uri Maven.

Implementarea completă a acestui tutorial poate fi găsită în acest (jar executabil) și în acest (război executabil) proiectele Github.

Cum se testează? Pentru a compila proiectul într-un jar executabil , rulați Maven cu comanda mvn clean package .

Sperăm că acest articol vă oferă mai multe informații despre acest subiect și veți găsi abordarea preferată în funcție de nevoile dvs.

O notă finală rapidă - asigurați-vă că licențele borcanelor pe care le grupați nu interzic acest tip de operație. În general, nu va fi cazul, dar merită luat în considerare.