Gibt es eine Möglichkeit, maven (2.0.9) zu zwingen, alle Abhängigkeiten in eine einzelne JAR-Datei aufzunehmen?
Ich habe ein Projekt, das in eine einzelne JAR-Datei eingebaut wird. Ich möchte, dass die Klassen aus Abhängigkeiten auch in das Glas kopiert werden.
Update: Ich weiß, dass ich nicht einfach eine JAR-Datei in eine JAR-Datei aufnehmen kann. Ich suche nach einer Möglichkeit, die als Abhängigkeiten angegebenen Jars zu entpacken und die Klassendateien in meine JAR zu packen.
Antworten:
Sie können dies mit dem Maven-Assembly-Plugin mit dem Deskriptor "jar-with-dependencies" tun. Hier ist der relevante Teil aus einer unserer pom.xml, der dies tut:
quelle
attached
Ziel ist veraltet. Dassingle
oderdirectory-single
-Ziel sollte stattdessen bevorzugt werden.directory-single
ist jetzt ebenfalls veraltet.Mit Maven 2 können Sie dazu das Maven2 Assembly Plugin verwenden, das eine vordefinierte Deskriptordatei für diesen Zweck enthält und die Sie einfach in der Befehlszeile verwenden können:
Wenn Sie dieses JAR ausführbar machen möchten, fügen Sie einfach die auszuführende Hauptklasse zur Plugin-Konfiguration hinzu:
Wenn Sie diese Assembly als Teil des normalen Erstellungsprozesses erstellen möchten, sollten Sie das Einzel- oder Verzeichnis-Einzelziel (das
assembly
Ziel sollte NUR über die Befehlszeile ausgeführt werden) an eine Lebenszyklusphase binden (package
sinnvoll).Passen Sie das
configuration
Element an Ihre Bedürfnisse an (z. B. mit dem gesprochenen Manifest).quelle
Wenn Sie eine ausführbare JAR-Datei erstellen möchten, müssen diese auch die Hauptklasse festlegen. Also sollte die vollständige Konfiguration sein.
quelle
<appendAssemblyId>false</appendAssemblyId>
innerhalb des<configuration>
Tags hinzufügen , um das Suffix "-jar-with-dependencies" im endgültigen Namen auszuschließen.Es gibt das Shadow Maven Plugin . Es kann zum Packen und Umbenennen von Abhängigkeiten verwendet werden (um Abhängigkeitsprobleme im Klassenpfad zu vermeiden).
quelle
Sie können das neu erstellte Glas mithilfe eines
<classifier>
Tags verwenden.quelle
Wenn Sie (wie ich) den oben beschriebenen Jar-with-Dependencies- Ansatz nicht besonders mögen , ist die von mir bevorzugte Maven-Lösung, einfach ein WAR-Projekt zu erstellen, auch wenn es sich nur um eine eigenständige Java-Anwendung handelt, die Sie erstellen:
Erstellen Sie ein normales Maven-JAR-Projekt, das Ihre JAR-Datei erstellt (ohne die Abhängigkeiten).
Richten Sie außerdem ein Maven-Kriegsprojekt ein (mit nur einer leeren Datei src / main / webapp / WEB-INF / web.xml , wodurch eine Warnung / ein Fehler im Maven-Build vermieden wird), die nur Ihr JAR-Projekt als enthält eine Abhängigkeit, und machen Sie Ihr jar-Projekt zu einem
<module>
unter Ihrem Kriegsprojekt. (Dieses Kriegsprojekt ist nur ein einfacher Trick, um alle Ihre JAR-Datei-Abhängigkeiten in eine Zip-Datei zu packen.)Erstellen Sie das Kriegsprojekt, um die Kriegsdatei zu erstellen.
Benennen Sie im Bereitstellungsschritt Ihre .war-Datei einfach in * .zip um und entpacken Sie sie.
Sie sollten jetzt ein lib-Verzeichnis (das Sie verschieben können, wo Sie es möchten) mit Ihrem jar und allen Abhängigkeiten haben, die Sie zum Ausführen Ihrer Anwendung benötigen:
(Der Platzhalter im Klassenpfad funktioniert in Java-6 oder höher.)
Ich denke, dies ist sowohl einfacher in Maven einzurichten (Sie müssen nicht mit dem Assembly-Plugin herumspielen) als auch bietet Ihnen eine klarere Ansicht der Anwendungsstruktur (Sie sehen die Versionsnummern aller abhängigen Jars in einfacher Ansicht und) Vermeiden Sie es, alles in einer einzigen JAR-Datei zu verstopfen.
quelle
http://fiji.sc/Uber-JAR bietet eine hervorragende Erklärung der Alternativen:
quelle
META-INF/services
Verzeichnis. Weitere Infos hier: maven.apache.org/plugins/maven-shade-plugin/examples/…quelle
Meine endgültige Lösung für Eclipse Luna und m2eclipse: Benutzerdefinierter Klassenladeprogramm (nur 5 Klassen herunterladen und zu Ihrem Projekt hinzufügen): http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org. eclipse.jdt.ui / jar% 20in% 20jar% 20loader / org / eclipse / jdt / internal / jarinjarloader / ; Dieser Classloader ist der beste Classloader mit einem Glas und sehr schnell.
<project.mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</project.mainClass> <project.realMainClass>my.Class</project.realMainClass>
Edit in JIJConstants "Rsrc-Class-Path" auf "Class-Path"
mvn sauber Abhängigkeit: copy-Abhängigkeiten Paket
ist ein Glas mit Abhängigkeiten in lib - Ordner mit einem dünnen Classloader erstellt
quelle
Wenn Sie Maven beiseite legen, können Sie JAR-Bibliotheken in das Hauptglas einfügen, müssen jedoch Ihren eigenen Klassenladeprogramm verwenden.
Überprüfen Sie dieses Projekt: One-JAR- Linktext
quelle
Dieser Beitrag ist vielleicht etwas alt, aber ich hatte in letzter Zeit auch das gleiche Problem. Die erste von John Stauffer vorgeschlagene Lösung ist gut, aber ich hatte einige Probleme, als ich diesen Frühling arbeite. Die von mir verwendeten Abhängigkeitsgläser des Frühlings enthalten einige Eigenschaftendateien und XML-Schemadeklarationen, die dieselben Pfade und Namen haben. Obwohl diese Gläser aus denselben Versionen stammen, sind die Gläser mit Abhängigkeiten Maven-Ziel " diese Datei mit der zuletzt gefundenen Datei überschrieben.
Am Ende konnte die Anwendung nicht gestartet werden, da die Federgläser nicht die richtigen Eigenschaftendateien finden konnten. In diesem Fall hat die von Rop vorgeschlagene Lösung mein Problem gelöst.
Auch seitdem existiert das Spring-Boot-Projekt. Es hat eine sehr coole Möglichkeit, dieses Problem zu lösen, indem ein Maven-Ziel bereitgestellt wird, das das Paketziel überlastet und einen eigenen Klassenlader bereitstellt. Siehe Referenzhandbuch für Federstiefel
quelle
Schauen Sie sich diese Antwort an:
Ich erstelle ein Installationsprogramm, das als Java-JAR-Datei ausgeführt wird und WAR- und JAR-Dateien an den entsprechenden Stellen im Installationsverzeichnis entpacken muss. Das Abhängigkeits-Plugin kann in der Paketphase mit dem Kopierziel verwendet werden. Es lädt alle Dateien im Maven-Repository (einschließlich WAR-Dateien) herunter und schreibt sie, wo immer Sie sie benötigen. Ich habe das Ausgabeverzeichnis in $ {project.build.directory} / classes geändert und das Endergebnis ist, dass die normale JAR-Aufgabe meine Dateien einwandfrei enthält. Ich kann sie dann extrahieren und in das Installationsverzeichnis schreiben.
quelle
Vielen Dank, ich habe unten Snippet in POM.xml-Datei hinzugefügt und Mp-Problem behoben und erstellen Sie Fat JAR-Datei, die alle abhängigen Gläser enthält.
quelle