Comment puis-je mettre tous les fichiers JAR requirejs dans un dossier de bibliothèque dans le fichier JAR final avec Maven?

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 indiqué dans l’une des réponses ici:

Comment créer un fichier JAR exécutable avec des dépendances utilisant Maven?

Je veux que mon fichier JAR final ait un dossier de bibliothèque contenant les dépendances en tant que fichiers JAR, pas comme le 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:

   org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies   ${project.build.directory}/classes/lib false false true      org.apache.maven.plugins maven-jar-plugin    true lib/ com.myapp.MainClass      org.apache.maven.plugins maven-comstackr-plugin  1.6 1.6    org.apache.maven.plugins maven-dependency-plugin   install install  sources      org.apache.maven.plugins maven-resources-plugin 2.5  UTF-8    

Le projet fonctionne correctement à partir d’Eclipse et les fichiers JAR sont placés dans le dossier de la bibliothèque dans mon fichier JAR final comme je le souhaite, mais lorsque j’exécute le fichier JAR final à partir du dossier cible, je reçois toujours une 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?

Voici ma solution. Testez-le si cela fonctionne pour vous:

  org.apache.maven.plugins maven-dependency-plugin   copy-dependencies prepare-package  copy-dependencies   ${project.build.directory}/classes/lib false false true      org.apache.maven.plugins maven-jar-plugin    true     lib/     

Le premier plugin place toutes les dépendances dans le dossier target / classes / lib, le second inclut le dossier de la bibliothèque dans le fichier JAR final et configure le fichier Manifest.mf .

Mais vous devrez ensuite append 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’objective.

Cela fait deux ans que la question a été posée. Le problème des fichiers JAR nesteds persiste néanmoins. J’espère que ça aide quelqu’un.

Actualisé:

    maven-dependency-plugin   install  copy-dependencies   ${project.build.directory}/lib       

Le moyen le plus simple et le plus efficace consiste à utiliser un plug-in comme celui-ci:

   org.apache.maven.plugins maven-shade-plugin   package  shade     uber-${artifactId}-${version}   

Vous aurez normalisé tout dans un fichier JAR.

Le plug-in maven packer exécutable peut être utilisé à cette fin: créer des applications Java autonomes contenant toutes les dépendances en tant que fichiers JAR dans un dossier spécifique.

Ajoutez simplement ce qui suit à votre pom.xml dans la section (veillez à remplacer la valeur de mainClass conséquence):

  de.ntcomputer executable-packer-maven-plugin 1.0.1  com.example.MyMainClass     pack-executable-jar     

Le fichier JAR intégré se trouve dans target/-pkg.jar après l’exécution mvn package . Toutes ses dépendances à la compilation et à l’exécution seront incluses dans le dossier lib/ du fichier JAR.

Disclaimer: Je suis l’auteur du plugin.

en suivant ce lien:

Comment: Eclipse Maven installe jar avec des dépendances

J’ai découvert que cette solution ne fonctionnait pas, car le chargeur de classes ne charge pas les jars depuis les jars, alors je pense que je vais déballer les dépendances dans le jar.

Voici comment je le fais:

   maven-assembly-plugin 2.2  false  jar-with-dependencies    com.project.MainClass     

Et puis je viens de courir:

 mvn 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 de bin avec un exécutable unix et un exécutable dos.

L’exécutable appelle finalement java avec un argument -cp qui répertorie toutes vos bibliothèques dépendantes.

L’ensemble se trouve dans un dossier d’assemblage dans le dossier cible. Épique.

============= Oui, je sais que c’est un vieux sujet, mais il ya encore des résultats de recherche, alors j’ai pensé que cela pourrait aider quelqu’un comme moi.

C’est clairement un problème de classpath. Prenez en compte que le classpath 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 fichiers JAR relatifs au dossier racine de votre projet, alors que dans le cas du fichier JAR final, cela n’est généralement pas vrai.

Ce que j’aime faire dans ces situations est de construire le JAR manuellement. Cela me prend au maximum 5 minutes et ça résout toujours le problème. Je ne vous suggère pas de le faire. Trouver un moyen d’utiliser Maven, c’est son objective.