So erstellen Sie eine ausführbare JAR mit Maven

1. Einleitung

In diesem kurzen Artikel konzentrieren wir uns auf das Packen eines Maven-Projekts in eine ausführbare Jar-Datei .

Normalerweise möchten wir beim Erstellen einer JAR- Datei diese einfach ausführen, ohne die IDE zu verwenden. Zu diesem Zweck werden wir die Konfiguration und die Vor- und Nachteile der Verwendung jedes dieser Ansätze zum Erstellen der ausführbaren Datei erörtern.

2. Konfiguration

Um eine ausführbare JAR- Datei zu erstellen , benötigen wir keine zusätzlichen Abhängigkeiten. Wir müssen nur ein Maven-Java-Projekt erstellen und mindestens eine Klasse mit der Hauptmethode (…) haben .

In unserem Beispiel haben wir eine Java-Klasse mit dem Namen ExecutableMavenJar erstellt.

Wir müssen auch sicherstellen, dass unsere pom.xml die folgenden Elemente enthält:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

Der wichtigste Aspekt hierbei ist der Typ. Um ein ausführbares JAR zu erstellen , überprüfen Sie, ob die Konfiguration einen JAR- Typ verwendet.

Jetzt können wir die verschiedenen Lösungen verwenden.

2.1. Manuelle Konfiguration

Beginnen wir mit einem manuellen Ansatz - mit Hilfe des Maven-Dependency-Plugins .

Zuerst kopieren wir alle erforderlichen Abhängigkeiten in den Ordner, den wir angeben:

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

Es sind zwei wichtige Aspekte zu beachten. Zuerst geben wir das Ziel copy-Abhängigkeiten , die Maven sagt diese Abhängigkeiten in den angegebenen kopieren ausgabe .

In unserem Fall werden wir einen Ordner mit dem Namen erstellen Libs , innerhalb des Projekts Build - Verzeichnis (das in der Regel das ist Zielordner).

Im zweiten Schritt erstellen wir eine ausführbare und klassenpfadbewusste JAR- Datei mit dem Link zu den im ersten Schritt kopierten Abhängigkeiten:

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

Der wichtigste Teil der oben genannten ist die Manifestkonfiguration . Wir fügen einen Klassenpfad mit allen Abhängigkeiten (Ordner libs / ) hinzu und geben die Informationen zur Hauptklasse an.

Bitte beachten Sie, dass wir einen vollständig qualifizierten Namen der Klasse angeben müssen, was bedeutet, dass er den Paketnamen enthält.

Die Vor- und Nachteile dieses Ansatzes sind:

  • Pro - transparenter Prozess, in dem wir jeden Schritt spezifizieren können
  • Nachteile - Abhängigkeiten befinden sich außerhalb der endgültigen JAR- Datei. Dies bedeutet, dass Ihre ausführbare JAR- Datei nur ausgeführt wird, wenn der Ordner libs für eine JAR- Datei zugänglich und sichtbar ist

2.2. Apache Maven Assembly Plugin

Mit dem Apache Maven Assembly Plugin können Benutzer die Projektausgabe zusammen mit ihren Abhängigkeiten, Modulen, der Site-Dokumentation und anderen Dateien in einem einzigen ausführbaren Paket zusammenfassen.

Das Hauptziel im Assembly-Plugin ist das einzelne Ziel, mit dem alle Assemblys erstellt werden (alle anderen Ziele sind veraltet und werden in einer zukünftigen Version entfernt).

Werfen wir einen Blick auf die Konfiguration in pom.xml :

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

Ähnlich wie beim manuellen Ansatz müssen wir die Informationen über die Hauptklasse bereitstellen. Der Unterschied besteht darin, dass das Maven Assembly Plugin automatisch alle erforderlichen Abhängigkeiten in eine JAR- Datei kopiert .

Im DeskriptorRefs- Teil des Konfigurationscodes haben wir den Namen angegeben, der dem Projektnamen hinzugefügt wird.

Die Ausgabe in unserem Beispiel wird als core-java-jar-with-dependencies.jar bezeichnet.

  • Profis - Abhängigkeiten innerhalb der JAR- Datei, nur eine Datei
  • Nachteile - Grundlegende Kontrolle beim Verpacken Ihres Artefakts. Beispielsweise gibt es keine Unterstützung für Klassenverlagerungen

2.3. Apache Maven Shade Plugin

Das Apache Maven Shade Plugin bietet die Möglichkeit, das Artefakt in ein Uber-Jar zu packen , das aus allen Abhängigkeiten besteht, die zum Ausführen des Projekts erforderlich sind. Darüber hinaus unterstützt es das Schattieren - dh das Umbenennen - der Pakete einiger Abhängigkeiten.

Werfen wir einen Blick auf die Konfiguration:

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

Diese Konfiguration besteht aus drei Hauptteilen:

Zuerst, Markiert alle Abhängigkeiten, die in das Glas gepackt werden sollen .

Zweitens müssen wir die Transformatorimplementierung spezifizieren; In unserem Beispiel haben wir den Standard verwendet.

Schließlich müssen wir die Hauptklasse unserer Anwendung angeben.

Die Ausgabedatei heißt core-java-0.1.0-SNAPSHOT-shaded.jar , wobei core-java unser Projektname ist, gefolgt von der Snapshot-Version und dem Plugin-Namen.

  • Vorteile - Abhängigkeiten innerhalb der JAR- Datei, erweiterte Kontrolle des Packens Ihres Artefakts mit Schattierung und Klassenverschiebung
  • Nachteile - komplexe Konfiguration (insbesondere wenn wir erweiterte Funktionen verwenden möchten)

2.4. Ein Jar Maven Plugin

Eine weitere Option zum Erstellen einer ausführbaren JAR ist das One Jar-Projekt.

Dies bietet einen benutzerdefinierten Klassenladeprogramm, das weiß, wie Klassen und Ressourcen aus JARs in einem Archiv anstatt aus JARs im Dateisystem geladen werden.

Werfen wir einen Blick auf die Konfiguration:

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

Wie in der Konfiguration gezeigt, müssen wir die Hauptklasse angeben und alle zu erstellenden Abhängigkeiten mithilfe von attachToBuild = true anhängen .

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 diesem Artikel haben wir viele Möglichkeiten zum Erstellen einer ausführbaren JAR- Datei mit verschiedenen Maven-Plugins beschrieben.

Die vollständige Implementierung dieses Tutorials finden Sie in diesem (ausführbare JAR) und diesem (ausführbaren Krieg) Github-Projekt.

Wie teste ich? Um das Projekt in eine ausführbare JAR- Datei zu kompilieren , führen Sie Maven mit dem Befehl mvn clean package aus .

Hoffentlich gibt Ihnen dieser Artikel weitere Einblicke in das Thema und Sie finden Ihren bevorzugten Ansatz in Abhängigkeit von Ihren Anforderungen.

Ein kurzer letzter Hinweis: Stellen Sie sicher, dass die Lizenzen der von Ihnen gebündelten Gläser diese Art von Vorgang nicht verbieten. Im Allgemeinen wird dies nicht der Fall sein, aber es ist eine Überlegung wert.