Ich verwende Maven in meiner eigenständigen Anwendung und möchte alle Abhängigkeiten in meiner JAR-Datei in einen Bibliotheksordner packen, wie in einer der Antworten hier erwähnt:
Wie kann ich mit Maven eine ausführbare JAR mit Abhängigkeiten erstellen?
Ich möchte, dass meine endgültige JAR-Datei einen Bibliotheksordner enthält, der die Abhängigkeiten als JAR-Dateien enthält, nicht so, wie maven-shade-plugin
die Abhängigkeiten in Form von Ordnern wie der Maven-Hierarchie im Ordner .m2 abgelegt werden.
Eigentlich macht die aktuelle Konfiguration das, was ich will, aber ich habe ein Problem beim Laden der JAR-Dateien beim Ausführen der Anwendung. Ich kann die Klassen nicht laden.
Hier ist meine Konfiguration:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.myapp.MainClass</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>install</id>
<phase>install</phase>
<goals>
<goal>sources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
Das Projekt läuft einwandfrei von Eclipse aus, und die JAR-Dateien werden wie gewünscht im Bibliotheksordner in meiner endgültigen JAR-Datei abgelegt. Wenn ich jedoch die endgültige JAR-Datei aus dem Zielordner ausführe, erhalte ich immer Folgendes ClassNotFoundException
:
Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: com.myapp.MainClass. Program will exit.
Wie kann ich diese Ausnahme beheben?
quelle
com.myapp.MainClass
gesucht wird, nichtcom.tastycafe.MainClass
.Antworten:
Das Folgende ist meine Lösung. Testen Sie es, wenn es für Sie funktioniert:
Das erste Plugin legt alle Abhängigkeiten im Ordner target / classes / lib ab, das zweite enthält den Bibliotheksordner in der endgültigen JAR-Datei und konfiguriert die
Manifest.mf
Datei.Dann müssen Sie jedoch benutzerdefinierten Klassenladecode hinzufügen, um die JAR-Dateien zu laden.
Um ein benutzerdefiniertes Laden von Klassen zu vermeiden, können Sie "$ {project.build.directory} / lib" verwenden. In diesem Fall haben Sie jedoch keine Abhängigkeiten in der endgültigen JAR-Datei, wodurch der Zweck zunichte gemacht wird.
Es ist zwei Jahre her, seit die Frage gestellt wurde. Das Problem verschachtelter JAR-Dateien besteht dennoch. Ich hoffe es hilft jemandem.
quelle
Aktualisiert:
quelle
Der einfachste und effizienteste Weg ist die Verwendung eines Uber-Plugins wie folgt:
Sie haben alle in einer JAR-Datei de-normalisiert.
quelle
Das ausführbare Packer Maven Plugin kann genau für diesen Zweck verwendet werden: Erstellen von eigenständigen Java-Anwendungen, die alle Abhängigkeiten als JAR-Dateien in einem bestimmten Ordner enthalten.
Fügen Sie einfach die folgende zu Ihrem
pom.xml
Inneren des<build><plugins>
Abschnitts (achten Sie darauf , den Wert zu ersetzen ,mainClass
entsprechend):Die erstellte JAR-Datei befindet sich
target/<YourProjectAndVersion>-pkg.jar
nach dem Ausführen untermvn package
. Alle Abhängigkeiten zur Kompilierungszeit und zur Laufzeit werden in denlib/
Ordner in der JAR-Datei aufgenommen.Haftungsausschluss: Ich bin der Autor des Plugins.
quelle
Folgen Sie diesem Link:
Gewusst wie: Eclipse Maven installiert Build Jar mit Abhängigkeiten
Ich fand heraus, dass dies keine praktikable Lösung ist, da der Klassenlader keine Jars aus Jars lädt, also denke ich, dass ich die Abhängigkeiten innerhalb des Jars entpacken werde.
quelle
So mache ich das:
Und dann renne ich einfach:
quelle
assembly
nur das, was sich in "Ziel / Klassen" befindet, in die JAR eingefügt wird. Dadurch wird sichergestellt, dass die JAR alle Änderungen enthält, die Sie kürzlich am Quellcode vorgenommen haben. Sie sollten also Folgendes tun :mvn clean compile assembly:assembly
.Ich habe diese Antwort auf die Frage gefunden:
http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html
Sie erhalten nicht nur die abhängigen lib-Dateien in einem lib-Ordner, sondern auch einen bin-Director mit einer ausführbaren Unix- und einer dos-Datei.
Die ausführbare Datei ruft Java letztendlich mit einem -cp-Argument auf, das auch alle abhängigen Bibliotheken auflistet.
Das gesamte Los befindet sich in einem Appasembly-Ordner im Zielordner. Epos.
============= Ja, ich weiß, dass dies ein alter Thread ist, aber die Suchergebnisse sind immer noch hoch, daher dachte ich, es könnte jemandem wie mir helfen.
quelle
Dies ist eindeutig ein Klassenpfadproblem. Beachten Sie, dass sich der Klassenpfad etwas ändern muss, wenn Sie Ihr Programm außerhalb der IDE ausführen. Dies liegt daran, dass die IDE die anderen JARs relativ zum Stammordner Ihres Projekts lädt, während dies im Fall der endgültigen JAR normalerweise nicht der Fall ist.
In diesen Situationen möchte ich die JAR manuell erstellen. Es dauert höchstens 5 Minuten und löst immer das Problem. Ich schlage nicht vor, dass Sie dies tun. Finde einen Weg, Maven zu benutzen, das ist sein Zweck.
quelle