Existe-t-il un moyen de forcer maven (2.0.9) à inclure toutes les dépendances dans un seul fichier jar?
J'ai un projet les builds dans un seul fichier jar. Je veux que les classes des dépendances soient également copiées dans le pot.
Mise à jour: je sais que je ne peux pas simplement inclure un fichier jar dans un fichier jar. Je cherche un moyen de décompresser les fichiers JAR spécifiés en tant que dépendances et de regrouper les fichiers de classe dans mon fichier JAR.
Réponses:
Vous pouvez le faire en utilisant le plugin maven-assembly avec le descripteur "jar-with-dependencies". Voici le morceau pertinent de l'un de nos pom.xml qui fait cela:
la source
attached
objectif est déconseillé. Lesingle
ou ledirectory-single
but devrait être préféré à la place.directory-single
est désormais obsolète également.Avec Maven 2, la bonne façon de le faire est d'utiliser le plugin d'assemblage Maven2 qui a un fichier de descripteur prédéfini à cet effet et que vous pouvez simplement utiliser sur la ligne de commande:
Si vous voulez rendre ce fichier exécutable, ajoutez simplement la classe principale à exécuter à la configuration du plugin:
Si vous souhaitez créer cet assembly dans le cadre du processus de génération normal, vous devez lier l' objectif unique ou l' annuaire unique (l'
assembly
objectif ne doit être exécuté qu'à partir de la ligne de commande) à une phase de cycle de vie (package
logique), quelque chose comme ceci:Adaptez l'
configuration
élément en fonction de vos besoins (par exemple avec les éléments manifestes tels que parlés).la source
Si vous souhaitez créer un fichier jar exécutable, vous devez également définir la classe principale. La configuration complète devrait donc l'être.
la source
<appendAssemblyId>false</appendAssemblyId>
à l'intérieur de la<configuration>
balise pour exclure le suffixe "-jar-with-dependencies" dans le nom final.Il y a le plugin shadow maven . Il peut être utilisé pour empaqueter et renommer les dépendances (pour omettre les problèmes de dépendance sur le chemin de classe).
la source
Vous pouvez utiliser le pot nouvellement créé à l'aide d'une
<classifier>
balise.la source
Si vous (comme moi) n'aimez pas particulièrement l' approche jar-with-dependencies décrite ci-dessus, la solution maven que je préfère est de simplement construire un projet WAR, même si ce n'est qu'une application Java autonome que vous construisez:
Faites un projet jar maven normal, qui va construire votre fichier jar (sans les dépendances).
En outre, configurez un projet de guerre maven (avec uniquement un fichier src / main / webapp / WEB-INF / web.xml vide , ce qui évitera un avertissement / une erreur dans la construction maven), qui n'a que votre projet jar comme une dépendance, et faites de votre projet de pot un
<module>
sous votre projet de guerre. (Ce projet de guerre n'est qu'une simple astuce pour envelopper toutes vos dépendances de fichier jar dans un fichier zip.)Générez le projet war pour produire le fichier war.
Dans l'étape de déploiement, renommez simplement votre fichier .war en * .zip et décompressez-le.
Vous devriez maintenant avoir un répertoire lib (que vous pouvez déplacer où vous le voulez) avec votre jar et toutes les dépendances dont vous avez besoin pour exécuter votre application:
(Le caractère générique dans classpath fonctionne en Java-6 ou supérieur)
Je pense que cela est à la fois plus simple à configurer dans maven (pas besoin de jouer avec le plugin d'assemblage) et vous donne également une vue plus claire de la structure de l'application (vous verrez les numéros de version de tous les pots dépendants en clair, et éviter de tout obstruer dans un seul fichier jar).
la source
http://fiji.sc/Uber-JAR fournit une excellente explication des alternatives:
la source
META-INF/services
répertoire. Plus d'infos ici: maven.apache.org/plugins/maven-shade-plugin/examples/…la source
Ma solution définitive sur Eclipse Luna et m2eclipse: chargeur de classe personnalisé (télécharger et ajouter à votre projet, 5 classes uniquement): http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/plain/org. eclipse.jdt.ui / jar% 20in% 20jar% 20loader / org / eclipse / jdt / internal / jarinjarloader / ; ce chargeur de classe est le meilleur du chargeur de classe à un pot et très rapide;
<project.mainClass>org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader</project.mainClass> <project.realMainClass>my.Class</project.realMainClass>
Modifier dans JIJConstants "Rsrc-Class-Path" en "Class-Path"
mvn clean dependency: le package copy-dependencies
est créé un pot avec les dépendances dans le dossier lib avec un chargeur de classe léger
la source
En mettant Maven de côté, vous pouvez mettre les bibliothèques JAR à l'intérieur du pot principal, mais vous devrez utiliser votre propre chargeur de classe.
Vérifier ce projet: texte du lien One-JAR
la source
Ce message est peut-être un peu ancien, mais j'ai également eu le même problème récemment. La première solution proposée par John Stauffer est bonne, mais j'ai eu quelques problèmes en travaillant ce printemps. Les jars de dépendance du printemps que j'utilise ont des fichiers de propriétés et une déclaration de schémas xml qui partagent les mêmes chemins et noms. Bien que ces pots proviennent des mêmes versions, le pot avec dépendances maven-goal remplaçait ce fichier par le dernier fichier trouvé.
Au final, l'application n'a pas pu démarrer car les pots à ressort n'ont pas pu trouver les bons fichiers de propriétés. Dans ce cas, la solution proposée par Rop a résolu mon problème.
Depuis lors, le projet Spring-Boot existe désormais. Il a un moyen très cool de gérer ce problème en fournissant un objectif maven qui surcharge l'objectif du package et fournit son propre chargeur de classe. Voir le guide de référence des bottines à ressorts
la source
Jetez un œil à cette réponse:
Je crée un programme d'installation qui s'exécute en tant que fichier Java JAR et il doit décompresser les fichiers WAR et JAR aux endroits appropriés du répertoire d'installation. Le plugin de dépendance peut être utilisé dans la phase de package avec l'objectif de copie et il téléchargera n'importe quel fichier dans le référentiel Maven (y compris les fichiers WAR) et les enregistrera où vous en aurez besoin. J'ai changé le répertoire de sortie en $ {project.build.directory} / classes et le résultat final est que la tâche JAR normale inclut très bien mes fichiers. Je peux ensuite les extraire et les écrire dans le répertoire d'installation.
la source
Merci j'ai ajouté l'extrait ci-dessous dans le fichier POM.xml et le problème Mp résolu et crée un fichier jar fat qui inclut tous les jars dépendants.
la source