J'utilise Maven dans mon application autonome et je souhaite empaqueter toutes les dépendances de mon fichier JAR dans un dossier de bibliothèque, comme mentionné dans l'une des réponses ici:
Comment puis-je créer un JAR exécutable avec des dépendances à l'aide de Maven?
Je veux que mon fichier JAR final ait un dossier de bibliothèque qui contient les dépendances en tant que fichiers JAR, pas comme ce maven-shade-plugin
qui place les dépendances sous la forme de dossiers comme la hiérarchie Maven dans le dossier .m2.
Eh bien, en fait, la configuration actuelle fait ce que je veux, mais j'ai un problème avec le chargement des fichiers JAR lors de l'exécution de l'application. Je ne peux pas charger les classes.
Voici ma configuration:
<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>
Le projet fonctionne correctement à partir d'Eclipse et les fichiers JAR sont placés dans le dossier de la bibliothèque à l'intérieur de mon fichier JAR final comme je le souhaite, mais lors de l'exécution du fichier JAR final à partir du dossier cible, j'obtiens toujours 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.
Comment puis-je corriger cette exception?
la source
com.myapp.MainClass
soit recherchée, noncom.tastycafe.MainClass
.Réponses:
Voici ma solution. Testez-le si cela fonctionne pour vous:
Le premier plugin place toutes les dépendances dans le dossier target / classes / lib, et le second inclut le dossier de la bibliothèque dans le fichier JAR final, et configure le
Manifest.mf
fichier.Mais ensuite, vous devrez ajouter un code de chargement de classe personnalisé pour charger les fichiers JAR.
Ou, pour éviter le chargement de classe personnalisé, vous pouvez utiliser "$ {project.build.directory} / lib, mais dans ce cas, vous n'avez pas de dépendances dans le fichier JAR final, ce qui va à l'encontre de l'objectif.
Cela fait deux ans que la question a été posée. Le problème des fichiers JAR imbriqués persiste néanmoins. J'espère que cela aide quelqu'un.
la source
Actualisé:
la source
Le moyen le plus simple et le plus efficace est d'utiliser un plugin uber comme celui-ci:
Vous aurez tout normalisé dans un seul fichier JAR.
la source
Le plugin exécutable packer maven peut être utilisé exactement dans ce but: créer des applications Java autonomes contenant toutes les dépendances sous forme de fichiers JAR dans un dossier spécifique.
Ajoutez simplement ce qui suit à votre
pom.xml
intérieur de la<build><plugins>
section (assurez-vous de remplacer la valeur de enmainClass
conséquence):Le fichier JAR généré se trouve
target/<YourProjectAndVersion>-pkg.jar
après l'exécutionmvn package
. Toutes ses dépendances de compilation et d'exécution seront incluses dans lelib/
dossier à l'intérieur du fichier JAR.Avertissement: je suis l'auteur du plugin.
la source
en suivant ce lien:
Comment: Eclipse Maven installe le fichier JAR de construction avec les dépendances
J'ai découvert que ce n'est pas une solution réalisable car le chargeur de classe ne charge pas les fichiers JAR à partir des fichiers JAR, donc je pense que je vais décompresser les dépendances à l'intérieur du fichier JAR.
la source
Voici comment je procède:
Et puis je viens de courir:
la source
assembly
mettra simplement tout ce qui se trouve dans "target / classes" dans le JAR. Cela garantira que le JAR inclut toutes les modifications que vous avez récemment apportées au code source. Donc, vous devez faire quelque chose comme:mvn clean compile assembly:assembly
.J'ai trouvé cette réponse à la question:
http://padcom13.blogspot.co.uk/2011/10/creating-standalone-applications-with.html
Non seulement vous obtenez les fichiers lib dépendants dans un dossier lib, mais vous obtenez également un directeur bin avec à la fois un exécutable unix et dos.
L'exécutable appelle finalement java avec un argument -cp qui répertorie également toutes vos bibliothèques dépendantes.
L'ensemble se trouve dans un dossier d'assemblage à l'intérieur du dossier cible. Épique.
============= Oui, je sais que c'est un vieux fil de discussion, mais il arrive toujours en tête des résultats de recherche, alors j'ai pensé que cela pourrait aider quelqu'un comme moi.
la source
Il s'agit clairement d'un problème de chemin de classe. Tenez compte du fait que le chemin de classe doit changer un peu lorsque vous exécutez votre programme en dehors de l'EDI. Cela est dû au fait que l'EDI charge les autres JAR par rapport au dossier racine de votre projet, alors que dans le cas du JAR final, ce n'est généralement pas le cas.
Ce que j'aime faire dans ces situations, c'est créer le JAR manuellement. Cela me prend au plus 5 minutes et cela résout toujours le problème. Je ne vous suggère pas de faire cela. Trouver un moyen d'utiliser Maven, c'est son but.
la source