Comment puis-je mettre tous les requis des fichiers JAR dans un dossier de la bibliothèque de l'intérieur du dernier fichier JAR avec Maven?
Je suis à l'aide de Maven dans mon application autonome, et je veux le package de toutes les dépendances dans mon fichier JAR dans un dossier de la bibliothèque, comme mentionné dans une des réponses ici:
Comment puis-je créer un fichier exécutable JAR avec des dépendances à l'aide de Maven?
Je veux mon dernier fichier JAR pour avoir un dossier de bibliothèque qui contient les dépendances dans des fichiers JAR, pas comme ce que les maven-shade-plugin
qui met les dépendances sous la forme de dossiers comme le Maven hiérarchie dans l' .m2 dossier.
Bien, en fait, la configuration actuelle est 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 bien à partir d'Eclipse, et les fichiers JAR sont mis dans le dossier de la bibliothèque de l'intérieur de mon dernier fichier JAR que je veux, mais lors de l'exécution de la dernière fichier JAR à partir du dossier cible, je reçois 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?
- qui commande que vous utilisez pour exécuter le pot? probablement vous préférerez peut-être maven plugin exec?
- Est le message de l'exception de date par rapport à la POM fichier? Il semble que la classe principale
com.myapp.MainClass
est recherché, pascom.tastycafe.MainClass
. - Jones, copier coller le problème, j'ai édité la question
- Notez que si vous voulez des pots à l'intérieur du pot, puis la norme chargeurs de classes en Java ne peut pas les comprendre.
- Comment faire placer les dépendances maven dans un dossier lib, mais en dehors du BOCAL?
Vous devez vous connecter pour publier un commentaire.
Voici ma solution. Tester si cela fonctionne pour vous:
Le premier plugin met toutes les dépendances dans le target/classes/dossier lib, et la seconde comprend le dossier de la bibliothèque dans le dernier fichier JAR, et configure le
Manifest.mf
fichier.Mais alors vous aurez besoin d'ajouter des classloading le code pour charger les fichiers JAR.
Ou, pour éviter personnalisé classloading, vous pouvez utiliser "${projet.construire.annuaire}/lib, mais dans ce cas, vous n'avez pas de dépendances à l'intérieur du dernier fichier JAR, ce qui est contraire au but.
Ça fait deux ans depuis que la question a été posée. Le problème d'imbrication des fichiers JAR persiste néanmoins. J'espère que cela aide quelqu'un.
Mise à jour:
Le plus simple et le plus efficace est d'utiliser un uber plugin comme ceci:
Vous aurez de normalisé, le tout dans un fichier JAR.
La exécutable packer plugin maven peut être utilisé pour exactement cet effet: la création autonome d'applications java contenant toutes les dépendances dans les fichiers JAR dans un dossier spécifique.
Il suffit d'ajouter les lignes suivantes à votre
pom.xml
à l'intérieur de la<build><plugins>
section (assurez-vous de remplacer la valeur demainClass
en conséquence):Le construit fichier JAR est situé à
target/<YourProjectAndVersion>-pkg.jar
après l'exécution demvn package
. Tous les de son de la compilation et de l'exécution des dépendances seront inclus dans lelib/
le dossier dans le fichier JAR.Disclaimer: je suis l'auteur du plugin.
suivant ce lien:
Comment: Eclipse, Maven installer construire pot avec dépendances
j'ai découvert que ce n'est pas la solution parce que la classe chargeur ne charge pas les pots de l'intérieur des pots, donc je pense que je vais déballer les dépendances à l'intérieur du bocal.
Heres comment je le fais:
Et puis je viens de lancer:
assembly
va juste mettre tout ce qui est dans "target/classes" dans le BOCAL. Cela permettra d'assurer que le POT inclut toutes les modifications récemment apportées au code source. Donc, vous devriez 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 obtenez-vous l'dépendante de la lib fichiers dans un dossier lib, vous obtenez également une corbeille de directeur avec un unix et dos exécutable.
L'exécutable en fin de compte les appels java avec un pc-argument que la liste de toutes les personnes à votre charge libs trop.
L'ensemble du lot se trouve dans un appasembly dossier dans le dossier cible. Épique.
=============
Oui je sais c'est un vieux thread, mais c'est encore plus forte sur les résultats de recherche, alors j'ai pensé que cela pourrait aider quelqu'un comme moi.
C'est clairement un problème de classpath. Prendre en considération le fait que le classpath doit changer un peu lorsque vous exécutez votre programme en dehors de l'IDE. C'est parce que l'IDE en charge les autres Pots par rapport à la racine du dossier de votre projet, alors que dans le cas de la finale de la JARRE ce n'est généralement pas vrai.
Ce que j'aime faire dans ces situations est de construire le POT manuellement. Il me prend 5 minutes et ça résout le problème. Je ne suggère pas que vous faites cela. Trouver un moyen d'utiliser Maven, c'est son but.