Ich möchte mein Projekt zur Verteilung in eine einzige ausführbare JAR packen.
Wie kann ich aus einem Maven-Projektpaket alle Abhängigkeits-JARs in meine Ausgabe-JAR erstellen?
Ich möchte mein Projekt zur Verteilung in eine einzige ausführbare JAR packen.
Wie kann ich aus einem Maven-Projektpaket alle Abhängigkeits-JARs in meine Ausgabe-JAR erstellen?
Antworten:
und du machst es mit
Das Kompilierungsziel sollte vor dem Zusammenbau hinzugefügt werden: einzeln oder anderweitig ist der Code in Ihrem eigenen Projekt nicht enthalten.
Weitere Details finden Sie in den Kommentaren.
In der Regel ist dieses Ziel an eine Build-Phase gebunden, die automatisch ausgeführt wird. Dadurch wird sichergestellt, dass die JAR beim Ausführen
mvn install
oder Ausführen einer Bereitstellung / Version erstellt wird.quelle
mvn clean compile assembly:single
.<appendAssemblyId>false</appendAssemblyId>
in das hinzufügenconfiguration
, um das nervige Suffix "-jar-with-dependencies" im Namen zu vermeidencompile
und du bist geschraubt.Sie können das Abhängigkeits-Plugin verwenden, um alle Abhängigkeiten vor der Paketphase in einem separaten Verzeichnis zu generieren und diese dann in den Klassenpfad des Manifests aufzunehmen:
Alternativ können Sie es
${project.build.directory}/classes/lib
als OutputDirectory verwenden, um alle JAR-Dateien in das Haupt-JAR zu integrieren. Anschließend müssen Sie jedoch benutzerdefinierten Klassenladecode hinzufügen, um die Jars zu laden.quelle
${project.build.directory}/classes/lib
alsoutputDirectory
ein Haupt .jar mit allen Abhängigkeiten innerhalb haben, aber - wie benutzerdefinierten Classloading Code hinzufügen diese Gläser zu laden? Ich muss die Arbeit wie folgt ausführen :java -jar main-jar-with-deps.jar
. Ist das möglich ?Ich habe über verschiedene Möglichkeiten gebloggt, dies zu tun.
Siehe Ausführbares Glas mit Apache Maven (WordPress)
oder ausführbares-jar-with-maven-Beispiel (GitHub)
Anmerkungen
Diese Vor- und Nachteile werden von Stephan bereitgestellt .
Für die manuelle Bereitstellung
Kopieren Sie Abhängigkeiten in ein bestimmtes Verzeichnis
Machen Sie das Jar Executable und Classpath Aware
Zu diesem Zeitpunkt
jar
ist das tatsächlich mit externen Klassenpfadelementen ausführbar.Bereitstellbare Archive erstellen
Die
jar
Datei kann nur mit dem Geschwisterverzeichnis ausgeführt werden...lib/
. Wir müssen Archive erstellen, um sie mit dem Verzeichnis und seinem Inhalt bereitzustellen.Jetzt haben Sie
target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)
welche jeweils dasjar
und enthältlib/*
.Apache Maven Assembly Plugin
Du hast
target/${project.bulid.finalName}-jar-with-dependencies.jar
.Apache Maven Shade Plugin
Du hast
target/${project.build.finalName}-shaded.jar
.onejar-maven-plugin
Spring Boot Maven Plugin
Du hast
target/${project.bulid.finalName}-spring-boot.jar
.quelle
Wenn wir die Antwort von Unanswered nehmen und neu formatieren, haben wir:
Als nächstes würde ich empfehlen, dies zu einem natürlichen Teil Ihres Builds zu machen, anstatt es explizit aufzurufen. Um dies zu einem integralen Bestandteil Ihres Builds zu machen, fügen Sie dieses Plugin zu Ihrem hinzu
pom.xml
und binden Sie es an daspackage
Lebenszyklusereignis. Ein Problem ist jedoch, dass Sie dasassembly:single
Ziel aufrufen müssen, wenn Sie es in Ihre pom.xml einfügen, während Sie "Assembly: Assembly" aufrufen würden, wenn Sie es manuell über die Befehlszeile ausführen.quelle
Verwenden Sie das Maven-Shade-Plugin, um alle Abhängigkeiten in ein Uber-Jar zu packen. Es kann auch zum Erstellen einer ausführbaren JAR-Datei verwendet werden, indem die Hauptklasse angegeben wird. Nachdem ich versucht hatte, Maven-Assembly und Maven-Jar zu verwenden, stellte ich fest, dass dieses Plugin meinen Anforderungen am besten entsprach.
Ich fand dieses Plugin besonders nützlich, da es den Inhalt bestimmter Dateien zusammenführt, anstatt sie zu überschreiben. Dies ist erforderlich, wenn Ressourcendateien in den Jars denselben Namen haben und das Plugin versucht, alle Ressourcendateien zu verpacken
Siehe Beispiel unten
quelle
Ich habe lange das Maven Assembly Plugin verwendet , aber ich konnte keine Lösung für das Problem mit finden
"already added, skipping"
. Jetzt benutze ich ein anderes Plugin - onejar-maven-plugin . Beispiel unten (mvn package
Build Jar):Sie müssen ein Repository für dieses Plugin hinzufügen:
quelle
Sie können das Maven-Dependency-Plugin verwenden, aber die Frage war, wie Sie eine ausführbare JAR erstellen. Um dies zu erreichen, muss die Antwort von Matthew Franglen wie folgt geändert werden (übrigens dauert die Erstellung des Abhängigkeits-Plugins länger, wenn von einem sauberen Ziel ausgegangen wird):
quelle
Sie können das Maven-Shade-Plugin verwenden, um ein Uber-Glas wie unten zu erstellen
quelle
Eine weitere Option, wenn Sie die anderen JAR-Inhalte in Ihrer einzelnen resultierenden JAR wirklich neu verpacken möchten, ist das Maven Assembly-Plugin . Es entpackt und packt dann alles in ein Verzeichnis über
<unpack>true</unpack>
. Dann hätten Sie einen zweiten Durchgang, der es zu einem massiven JAR machte.Eine weitere Option ist das OneJar-Plugin . Dies führt die obigen Umpackaktionen in einem Schritt aus.
quelle
Sie können Ihrer pom.xml Folgendes hinzufügen :
Anschließend müssen Sie über die Konsole in das Verzeichnis wechseln, in dem sich die Datei pom.xml befindet. Dann müssen Sie mvn assembly: single ausführen und dann wird hoffentlich Ihre ausführbare JAR-Datei mit Abhängigkeiten erstellt. Sie können dies überprüfen, wenn Sie mit cd ./target in das Ausgabeverzeichnis (Zielverzeichnis) wechseln und Ihr jar mit einem Befehl starten , der java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar ähnelt .
Ich habe dies mit Apache Maven 3.0.3 getestet .
quelle
Ich habe jede dieser Antworten durchgesehen, um ein fettes ausführbares Glas zu erstellen, das alle Abhängigkeiten enthält, und keine davon hat richtig funktioniert. Die Antwort ist das Schatten-Plugin, es ist sehr einfach und unkompliziert.
Beachten Sie, dass Ihre Abhängigkeiten über einen Kompilierungs- oder Laufzeitbereich verfügen müssen, damit dies ordnungsgemäß funktioniert.
Dieses Beispiel stammt von mkyong.com
quelle
plugin
Element gehtpom.xml
unterbuild/plugins
.Sie könnten das
maven-shade-plugin
und kombinierenmaven-jar-plugin
.maven-shade-plugin
packt Ihre Klassen und alle Abhängigkeiten in eine einzige JAR-Datei.maven-jar-plugin
die Hauptklasse Ihres ausführbaren jar angeben (siehe Set Up The Classpath , Kapitel "Make The Jar Executable").Beispiel für eine POM-Konfiguration für
maven-jar-plugin
:Erstellen Sie abschließend die ausführbare JAR-Datei, indem Sie Folgendes aufrufen:
quelle
Ken Liu hat es meiner Meinung nach richtig. Mit dem Maven-Abhängigkeits-Plugin können Sie alle Abhängigkeiten erweitern, die Sie dann als Ressourcen behandeln können. Auf diese Weise können Sie sie in das Hauptartefakt aufnehmen . Durch die Verwendung des Assembly-Plugins wird ein sekundäres Artefakt erstellt, das möglicherweise nur schwer geändert werden kann. In meinem Fall wollte ich benutzerdefinierte Manifesteinträge hinzufügen. Mein Pom endete als:
quelle
Es sollte so sein:
Das Entpacken muss sich in der Phase "Ressourcen generieren" befinden, da es in der Paketphase nicht als Ressourcen enthalten ist. Versuchen Sie es mit einem sauberen Paket und Sie werden sehen.
quelle
Problem beim Auffinden der freigegebenen Assembly-Datei mit dem Maven-Assembly-Plugin-2.2.1?
Versuchen Sie, den Konfigurationsparameter deskriptors ID anstelle der Parameter deskriptoren / deskriptor oder deskriptorsRefs / deskriptors zu verwenden.
Keiner von beiden tut das, was Sie brauchen: Suchen Sie im Klassenpfad nach der Datei. Natürlich müssen Sie das Paket hinzufügen, in dem sich die gemeinsam genutzte Assembly im Klassenpfad des Maven-Assembly-Plugins befindet (siehe unten). Wenn Sie Maven 2.x (nicht Maven 3.x) verwenden, müssen Sie diese Abhängigkeit möglicherweise in der obersten übergeordneten Datei pom.xml im Abschnitt pluginManagement hinzufügen.
Sehen Sie dies für weitere Details.
Klasse: org.apache.maven.plugin.assembly.io.DefaultAssemblyReader
Beispiel:
quelle
Um dieses Problem zu beheben, verwenden wir das Maven Assembly Plugin, das die JAR zusammen mit ihren Abhängigkeits-JARs in einer einzigen ausführbaren JAR-Datei erstellt. Fügen Sie einfach die folgende Plugin-Konfiguration in Ihre pom.xml-Datei ein.
Vergessen Sie danach nicht, das MAVEN-Tool mit dem Befehl mvn clean compile Assembly: single auszuführen
http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/
quelle
Ich werde die Frage nicht direkt beantworten, da andere dies bereits getan haben, aber ich frage mich wirklich, ob es eine gute Idee ist, alle Abhängigkeiten in das Projektglas selbst einzubetten.
Ich sehe den Punkt (einfache Bereitstellung / Verwendung), aber es hängt vom Anwendungsfall Ihres Projekts ab (und es kann Alternativen geben (siehe unten)).
Wenn Sie es vollständig eigenständig verwenden, warum nicht?
Wenn Sie Ihr Projekt jedoch in anderen Kontexten verwenden (z. B. in einer Webanwendung oder in einem Ordner, in dem sich andere Jars befinden), befinden sich möglicherweise JAR-Duplikate in Ihrem Klassenpfad (die im Ordner, die in den Jars). Vielleicht kein Angebot, aber ich vermeide dies normalerweise.
Eine gute Alternative:
So können Sie mit nur einem Manifest und einem "speziellen dynamischen Klassenladeprogramm" Ihr Projekt starten mit:
quelle
Um eine ausführbare JAR über die Befehlszeile selbst zu erstellen, führen Sie einfach den folgenden Befehl über den Projektpfad aus:
quelle
pom.xml
sonst bekommst duError reading assemblies: No assembly descriptors found.
. Das passiert mir sowieso.Dies ist der beste Weg, den ich gefunden habe:
Bei dieser Konfiguration befinden sich alle Abhängigkeiten in
/dependency-jars
. Meine Anwendung hat keineMain
Klasse, nur Kontext-Klassen, aber eine meiner Abhängigkeiten hat eineMain
Klasse (com.myDomain.etc.MainClassName
), die den JMX-Server startet und eine empfängtstart
oder einenstop
Parameter . Damit konnte ich meine Bewerbung folgendermaßen starten:Ich warte, es ist nützlich für euch alle.
quelle
Ich habe die in diesem Beitrag erwähnten Baum-Plugins verglichen. Ich habe 2 Gläser und ein Verzeichnis mit allen Gläsern generiert. Ich habe die Ergebnisse verglichen und definitiv ist das Maven-Shade-Plugin das Beste. Meine Herausforderung bestand darin, dass ich über mehrere Spring-Ressourcen verfügte, die zusammengeführt werden mussten, sowie über Jax-Rs und JDBC-Services. Sie wurden alle vom Schatten-Plugin im Vergleich zum Maven-Assembly-Plugin richtig zusammengeführt. In diesem Fall schlägt die Feder fehl, es sei denn, Sie kopieren sie in Ihren eigenen Ressourcenordner und führen sie einmal manuell zusammen. Beide Plugins geben den richtigen Abhängigkeitsbaum aus. Ich hatte mehrere Bereiche wie testen, bereitstellen, kompilieren usw. Der Test und die bereitgestellten wurden von beiden Plugins übersprungen. Beide haben das gleiche Manifest erstellt, aber ich konnte Lizenzen mit dem Shadow-Plugin mithilfe ihres Transformators konsolidieren. Mit dem Maven-Dependency-Plugin natürlich nicht ' Ich habe diese Probleme nicht, weil die Gläser nicht extrahiert werden. Aber wie einige andere darauf hingewiesen haben, müssen Sie eine zusätzliche Datei (en) mit sich führen, um ordnungsgemäß zu funktionieren. Hier ist ein Ausschnitt aus der pom.xml
quelle
Etwas, das für mich funktioniert hat, war:
Ich hatte einen außergewöhnlichen Fall, weil meine Abhängigkeit System eins war:
Ich habe den von @ user189057 bereitgestellten Code mit folgenden Änderungen geändert: 1) Das Maven-Dependency-Plugin wird in der Phase "Prepare-Package" ausgeführt. 2) Ich extrahiere die entpackte Klasse direkt in "Ziel / Klassen".
quelle
Ich habe hier die am besten gewählte Antwort versucht und konnte das Glas zum Laufen bringen. Das Programm lief jedoch nicht richtig. Ich weiß nicht, was der Grund war. Wenn ich versuche wegzulaufen
Eclipse
, erhalte ich ein anderes Ergebnis, aber wenn ich das JAR über die Befehlszeile , erhalte ich ein anderes Ergebnis (es stürzt mit einem programmspezifischen Laufzeitfehler ab).Ich hatte eine ähnliche Anforderung wie das OP, nur dass ich zu viele (Maven) Abhängigkeiten für mein Projekt hatte. Glücklicherweise war die einzige Lösung, die für mich funktionierte, die Verwendung
Eclipse
. Sehr einfach und sehr unkompliziert. Dies ist keine Lösung für das OP, sondern eine Lösung für jemanden, der eine ähnliche Anforderung hat, aber viele Maven-Abhängigkeiten hat.1) Klicken Sie einfach mit der rechten Maustaste auf Ihren Projektordner (in Eclipse) und wählen Sie
Export
2) Wählen Sie dann
Java
->Runnable Jar
3) Sie werden aufgefordert, den Speicherort der JAR-Datei auszuwählen
4) Wählen Sie abschließend die Klasse mit der Hauptmethode aus, die Sie ausführen möchten, und wählen Sie sie aus
Package dependencies with the Jar file
und klicken Sie daraufFinish
quelle
Dies könnte auch eine Option sein. Sie können Ihre JAR-Datei erstellen
quelle
Für alle, die nach Optionen suchen, um bestimmte Abhängigkeiten aus dem Uber-Jar auszuschließen, ist dies eine Lösung, die für mich funktioniert hat:
Es handelt sich also nicht um eine Konfiguration des MVN-Assembly-Plugins, sondern um eine Eigenschaft der Abhängigkeit.
quelle
Es gibt bereits Millionen von Antworten. Ich wollte hinzufügen, dass Sie nicht benötigen,
<mainClass>
wenn Sie Ihrer Anwendung keinen entryPoint hinzufügen müssen. Beispielsweise müssen APIs nicht unbedingt über einemain
Methode verfügen .Maven Plugin Konfiguration
bauen
überprüfen
quelle
Zur pom.xml hinzufügen:
und
Das ist es. Das nächste MVN-Paket erstellt zusätzlich ein Fettglas, einschließlich aller Abhängigkeitsgläser.
quelle
Das Maven-Assembly-Plugin hat bei mir super funktioniert. Ich habe Stunden mit dem Maven-Dependency-Plugin verbracht und konnte es nicht zum Laufen bringen. Der Hauptgrund war, dass ich im Konfigurationsabschnitt explizit die Artefaktelemente definieren musste, die enthalten sein sollten, wie es in der Dokumentation beschrieben ist . Es gibt dort ein Beispiel für die Fälle, in denen Sie es verwenden möchten, wie:,
mvn dependency:copy
in denen keine Artefaktelemente enthalten sind, es aber nicht funktioniert.quelle
Dieser Blog-Beitrag zeigt einen anderen Ansatz mit der Kombination der Plugins Maven-Jar und Maven-Assembly. Mit der Assembly-Konfigurations-XML aus dem Blog-Beitrag kann auch gesteuert werden, ob Abhängigkeiten erweitert oder nur in einem Ordner gesammelt und durch einen Klassenpfadeintrag im Manifest referenziert werden:
Und genau das wird hier beschrieben: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/
quelle
quelle
Okay, das ist meine Lösung. Ich weiß, dass die Datei pom.xml nicht verwendet wird. Ich hatte jedoch das Problem, dass mein Programm auf Netbeans kompiliert und ausgeführt wurde, aber es schlug fehl, als ich Java -jar MyJarFile.jar ausprobierte. Jetzt verstehe ich Maven nicht ganz und ich denke, aus diesem Grund hatte Netbeans 8.0.2 Probleme, meine JAR-Datei in eine Bibliothek aufzunehmen, um sie in eine JAR-Datei zu kopieren. Ich habe darüber nachgedacht, wie ich in Eclipse JAR-Dateien ohne Maven verwendet habe.
Es ist Maven, der alle Abhängigkeiten und Plugins kompilieren kann. Nicht Netbeans. (Wenn Sie Netbeans erhalten und Java .jar verwenden können, sagen Sie mir bitte, wie (^. ^) V)
[Gelöst - für Linux] durch Öffnen eines Terminals.
Dann
Nächster
Nächster
Dadurch wird eine JAR-Datei im Zielverzeichnis erstellt.
Jetzt
(Möglicherweise müssen Sie Folgendes ausführen:
chmod +x MyJarFile-1.0-jar-with-dependencies.jar
)Und schlussendlich
Bitte sehen Sie
https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException
Ich werde diese Lösung auf einigen anderen Seiten mit einem ähnlichen Problem veröffentlichen. Hoffentlich kann ich jemanden vor einer Woche der Frustration retten.
quelle