Come creare un JAR eseguibile con Maven

1. Introduzione

In questo rapido articolo ci concentreremo sulla creazione di un pacchetto di un progetto Maven in un file Jar eseguibile .

Di solito, quando creiamo un file jar , vogliamo eseguirlo facilmente, senza usare l'IDE; a tal fine, discuteremo la configurazione e i pro / contro dell'utilizzo di ciascuno di questi approcci per creare l'eseguibile.

2. Configurazione

Per creare un jar eseguibile , non abbiamo bisogno di dipendenze aggiuntive. Dobbiamo solo creare il progetto Java Maven e avere almeno una classe con il metodo main (…) .

Nel nostro esempio, abbiamo creato la classe Java denominata ExecutableMavenJar.

Dobbiamo anche assicurarci che il nostro pom.xml contenga i seguenti elementi:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

L'aspetto più importante qui è il tipo: per creare un jar eseguibile , ricontrolla che la configurazione utilizzi un tipo jar .

Ora possiamo iniziare a utilizzare le varie soluzioni.

2.1. Configurazione manuale

Cominciamo con un approccio manuale, con l'aiuto del plugin maven-dependency .

Innanzitutto, copieremo tutte le dipendenze richieste nella cartella che specificheremo:

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

Ci sono due aspetti importanti da notare. Innanzitutto, specifichiamo le dipendenze di copia dell'obiettivo , che dice a Maven di copiare queste dipendenze nella directory di output specificata .

Nel nostro caso, creeremo una cartella chiamata libs , all'interno della directory build del progetto (che di solito è la cartella di destinazione ).

Nella seconda fase, che stiamo per creare eseguibili e la classe percorso consapevoli vaso , con il link per le dipendenze copiati nella prima fase:

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

La parte più importante di quanto sopra è la configurazione manifest . Aggiungiamo un classpath, con tutte le dipendenze (cartella libs / ), e forniamo le informazioni sulla classe principale.

Tieni presente che dobbiamo fornire un nome completo della classe, il che significa che includerà il nome del pacchetto.

I vantaggi e gli svantaggi di questo approccio sono:

  • pro - processo trasparente, in cui possiamo specificare ogni passaggio
  • contro - manuale, le dipendenze sono fuori dal jar finale , il che significa che il tuo jar eseguibile verrà eseguito solo se la cartella libs sarà accessibile e visibile per un jar

2.2. Apache Maven Assembly Plugin

Il plugin Apache Maven Assembly consente agli utenti di aggregare l'output del progetto insieme alle sue dipendenze, moduli, documentazione del sito e altri file in un unico pacchetto eseguibile.

L'obiettivo principale del plug-in assembly è l' unico obiettivo, utilizzato per creare tutti gli assembly (tutti gli altri obiettivi sono deprecati e verranno rimossi in una versione futura).

Diamo un'occhiata alla configurazione in pom.xml :

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

Analogamente all'approccio manuale, dobbiamo fornire le informazioni sulla classe principale; la differenza è che il plugin Maven Assembly copierà automaticamente tutte le dipendenze richieste in un file jar .

Nella parte descriptorRefs del codice di configurazione, abbiamo fornito il nome, che verrà aggiunto al nome del progetto.

L'output nel nostro esempio sarà denominato core-java-jar-with-dependencies.jar.

  • pro - dipendenze all'interno del file jar , solo un file
  • contro - controllo di base del packaging del tuo artefatto, ad esempio, non c'è supporto per il riposizionamento della classe

2.3. Plugin Apache Maven Shade

Il plugin Apache Maven Shade fornisce la capacità di impacchettare l'artefatto in un uber-jar , che consiste di tutte le dipendenze richieste per eseguire il progetto. Inoltre, supporta l'ombreggiatura, ovvero la ridenominazione, dei pacchetti di alcune dipendenze.

Diamo uno sguardo alla configurazione:

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

Ci sono tre parti principali di questa configurazione:

Primo, contrassegna tutte le dipendenze da impacchettare nel jar .

In secondo luogo, dobbiamo specificare l'implementazione del trasformatore; abbiamo usato quello standard nel nostro esempio.

Infine, dobbiamo specificare la classe principale della nostra applicazione.

Il file di output sarà denominato core-java-0.1.0-SNAPSHOT-shaded.jar , dove core-java è il nome del nostro progetto, seguito dalla versione dell'istantanea e dal nome del plug-in.

  • pro : dipendenze all'interno del file jar , controllo avanzato del packaging del tuo artefatto, con ombreggiatura e riposizionamento delle classi
  • contro - configurazione complessa (soprattutto se vogliamo utilizzare funzionalità avanzate)

2.4. Plugin One Jar Maven

Un'altra opzione per creare un jar eseguibile è il progetto One Jar.

Questo fornisce un classloader personalizzato che sa come caricare classi e risorse da jar all'interno di un archivio, invece che da jar nel filesystem.

Diamo uno sguardo alla configurazione:

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

Come mostrato nella configurazione, dobbiamo specificare la classe principale e allegare tutte le dipendenze da compilare , utilizzando 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

In questo articolo, abbiamo descritto molti modi per creare un jar eseguibile con vari plugin Maven.

L'implementazione completa di questo tutorial può essere trovata in questo (jar eseguibile) e in questo (eseguibile war) progetti Github.

Come testare? Per compilare il progetto in un jar eseguibile , eseguire Maven con il comando mvn clean package .

Si spera che questo articolo ti fornisca ulteriori approfondimenti sull'argomento e troverai il tuo approccio preferito a seconda delle tue esigenze.

Una breve nota finale: assicurati che le licenze dei vasi che stai raggruppando non vietino questo tipo di operazione. In generale, non sarà così, ma è qualcosa che vale la pena considerare.