Je souhaite regrouper mon projet dans un seul fichier JAR exécutable pour distribution.
Comment puis-je faire un package de projet Maven tous les fichiers JAR de dépendance dans mon fichier JAR de sortie?
Je souhaite regrouper mon projet dans un seul fichier JAR exécutable pour distribution.
Comment puis-je faire un package de projet Maven tous les fichiers JAR de dépendance dans mon fichier JAR de sortie?
Réponses:
et vous l'exécutez avec
L'objectif de compilation doit être ajouté avant l'assemblage: seul ou sinon le code de votre propre projet n'est pas inclus.
Voir plus de détails dans les commentaires.
Généralement, cet objectif est lié à une phase de génération pour s'exécuter automatiquement. Cela garantit que le fichier JAR est créé lors de l'exécution
mvn install
ou de l'exécution d'un déploiement / d'une version.la source
mvn clean compile assembly:single
.<appendAssemblyId>false</appendAssemblyId>
dans leconfiguration
pour éviter le suffixe ennuyeux "-jar-with-dependencies" dans le nomcompile
et vous êtes foutu.Vous pouvez utiliser le plug-in de dépendance pour générer toutes les dépendances dans un répertoire distinct avant la phase de package, puis l'inclure dans le chemin de classe du manifeste:
Vous pouvez également utiliser
${project.build.directory}/classes/lib
comme OutputDirectory pour intégrer tous les fichiers jar dans le jar principal, mais vous devrez ensuite ajouter du code de chargement de classe personnalisé pour charger les jars.la source
${project.build.directory}/classes/lib
asoutputDirectory
pour avoir un .jar principal avec toutes les dépendances à l'intérieur, mais - Comment ajouter du code de chargement de classe personnalisé pour charger ces pots? Je dois faire l' exécution du travail comme:java -jar main-jar-with-deps.jar
. Est-ce possible ?J'ai blogué sur différentes façons de le faire.
Voir Pot exécutable avec Apache Maven (WordPress)
ou un exécutable-pot-avec-maven-exemple (GitHub)
Remarques
Ces avantages et inconvénients sont fournis par Stephan .
Pour un déploiement manuel
Copier les dépendances dans un répertoire spécifique
Rendre le fichier exécutable Jar et le chemin de classe sensibles
À ce stade, le
jar
est réellement exécutable avec des éléments de chemin de classe externes.Créer des archives déployables
Le
jar
fichier n'est exécutable qu'avec le...lib/
répertoire frère . Nous devons créer des archives à déployer avec l'annuaire et son contenu.Maintenant, vous avez
target/${project.build.finalName}.(zip|tar|tar.bz2|tar.gz)
chacun contenant lejar
etlib/*
.Plugin d'assemblage Apache Maven
Vous avez
target/${project.bulid.finalName}-jar-with-dependencies.jar
.Plugin Apache Maven Shade
Vous avez
target/${project.build.finalName}-shaded.jar
.plugin onejar-maven
Plugin Spring Boot Maven
Vous avez
target/${project.bulid.finalName}-spring-boot.jar
.la source
Prenant la réponse d'Unanswered et la reformatant, nous avons:
Ensuite, je recommanderais d'en faire une partie naturelle de votre build, plutôt que quelque chose à appeler explicitement. Pour en faire une partie intégrante de votre build, ajoutez ce plugin à votre
pom.xml
et liez-le à l'package
événement du cycle de vie. Cependant, un problème est que vous devez appeler l'assembly:single
objectif si vous mettez cela dans votre pom.xml, tandis que vous appelleriez 'assembly: assembly' si vous l'exécutez manuellement à partir de la ligne de commande.la source
Utilisez le plug-in maven-shadow pour regrouper toutes les dépendances dans un seul uber-jar. Il peut également être utilisé pour créer un fichier exécutable en spécifiant la classe principale. Après avoir essayé d'utiliser maven-assembly et maven-jar, j'ai trouvé que ce plugin convenait le mieux à mes besoins.
J'ai trouvé ce plugin particulièrement utile car il fusionne le contenu de fichiers spécifiques au lieu de les écraser. Cela est nécessaire lorsqu'il existe des fichiers de ressources portant le même nom dans les bocaux et que le plug-in essaie de regrouper tous les fichiers de ressources
Voir l'exemple ci-dessous
la source
J'ai longtemps utilisé le plugin d'assemblage maven , mais je n'ai pas pu trouver de solution au problème
"already added, skipping"
. Maintenant, j'utilise un autre plugin - onejar-maven-plugin . Exemple ci-dessous (mvn package
build jar):Vous devez ajouter un référentiel pour ce plugin:
la source
Vous pouvez utiliser le plugin maven-dependency-plugin, mais la question était de savoir comment créer un JAR exécutable. Pour ce faire, il faut apporter la modification suivante à la réponse de Matthew Franglen (btw, l'utilisation du plug-in de dépendance prend plus de temps à créer lors du démarrage à partir d'une cible propre):
la source
Vous pouvez utiliser le plugin maven-shadow pour construire un pot Uber comme ci-dessous
la source
Une autre option si vous voulez vraiment reconditionner les autres contenus JAR dans votre seul JAR résultant est le plugin Maven Assembly . Il décompresse puis reconditionne tout dans un répertoire via
<unpack>true</unpack>
. Ensuite, vous auriez un deuxième passage qui l'a intégré dans un JAR massif.Une autre option est le plugin OneJar . Cela effectue les actions de reconditionnement ci-dessus en une seule étape.
la source
Vous pouvez ajouter ce qui suit à votre pom.xml :
Ensuite, vous devez basculer via la console vers le répertoire, où se trouve le pom.xml. Ensuite, vous devez exécuter mvn assembly: single , puis votre fichier JAR exécutable avec les dépendances sera, espérons-le, construit. Vous pouvez le vérifier lorsque vous passez au répertoire de sortie (cible) avec cd ./target et que vous démarrez votre jar avec une commande similaire à java -jar mavenproject1-1.0-SNAPSHOT-jar-with-dependencies.jar .
J'ai testé cela avec Apache Maven 3.0.3 .
la source
J'ai parcouru chacune de ces réponses en cherchant à créer un gros fichier exécutable contenant toutes les dépendances et aucune ne fonctionnait correctement. La réponse est le plugin d'ombre, c'est très simple et direct.
N'oubliez pas que vos dépendances doivent avoir une portée de compilation ou d'exécution pour que cela fonctionne correctement.
Cet exemple vient de mkyong.com
la source
plugin
élément entre enpom.xml
dessousbuild/plugins
.Vous pouvez combiner le
maven-shade-plugin
etmaven-jar-plugin
.maven-shade-plugin
packs vos classes et toutes les dépendances dans un seul fichier jar.maven-jar-plugin
pour spécifier la classe principale de votre fichier exécutable (voir Configurer le chemin de classe , chapitre "Créer le fichier exécutable").Exemple de configuration POM pour
maven-jar-plugin
:Enfin, créez le fichier exécutable en appelant:
la source
Ken Liu a raison à mon avis. Le plugin de dépendance maven vous permet d'étendre toutes les dépendances, que vous pouvez ensuite traiter comme des ressources. Cela vous permet de les inclure dans l' artefact principal . L'utilisation du plugin d'assemblage crée un artefact secondaire qui peut être difficile à modifier - dans mon cas, je voulais ajouter des entrées de manifeste personnalisées. Mon pom a fini par:
la source
Ça devrait être comme ça:
Le déballage doit être en phase de génération de ressources car, s'il est en phase de package, il ne sera pas inclus en tant que ressources. Essayez un emballage propre et vous verrez.
la source
Un problème avec la localisation du fichier d'assembly partagé avec maven-assembly-plugin-2.2.1?
Essayez d'utiliser le paramètre de configuration descriptorId au lieu des paramètres descriptors / descriptor ou descriptorRefs / descriptorRef.
Aucun d'eux ne fait ce dont vous avez besoin: recherchez le fichier sur classpath. Bien sûr, vous devez ajouter le package dans lequel l'assembly partagé réside dans le chemin de classe de maven-assembly-plugin (voir ci-dessous). Si vous utilisez Maven 2.x (pas Maven 3.x), vous devrez peut-être ajouter cette dépendance dans pom.xml parent le plus haut dans la section pluginManagement.
Voir ceci pour plus de détails.
Classe: org.apache.maven.plugin.assembly.io.DefaultAssemblyReader
Exemple:
la source
Pour résoudre ce problème, nous utiliserons le plug-in d'assemblage Maven qui créera le fichier JAR avec ses fichiers JAR de dépendance dans un seul fichier JAR exécutable. Ajoutez simplement la configuration du plugin ci-dessous dans votre fichier pom.xml.
Après cela, n'oubliez pas d'exécuter l'outil MAVEN avec cette commande mvn clean compile assembly: single
http://jkoder.com/maven-creating-a-jar-together-with-its-dependency-jars-into-a-single-executable-jar-file/
la source
Je ne répondrai pas directement à la question car d'autres l'ont déjà fait auparavant, mais je me demande vraiment si c'est une bonne idée d'incorporer toutes les dépendances dans le pot du projet lui-même.
Je vois le point (facilité de déploiement / utilisation) mais cela dépend du cas d'utilisation de votre projet (et il peut y avoir des alternatives (voir ci-dessous)).
Si vous l'utilisez de manière totalement autonome, pourquoi pas.
Mais si vous utilisez votre projet dans d'autres contextes (comme dans une webapp, ou déposé dans un dossier où se trouvent d'autres pots), vous pouvez avoir des doublons de pots dans votre chemin de classe (ceux du dossier, celui des pots). Peut-être pas un accord d'enchère, mais j'évite généralement cela.
Une bonne alternative:
Comme ça, avec au final juste un manifeste et un "chargeur de classe dynamique spécial principal", vous pouvez démarrer votre projet avec:
la source
Pour créer un fichier JAR exécutable à partir de la ligne de commande elle-même, exécutez simplement la commande ci-dessous à partir du chemin du projet:
la source
pom.xml
cas contraireError reading assemblies: No assembly descriptors found.
. C'est ce qui m'arrive de toute façon.C'est le meilleur moyen que j'ai trouvé:
Avec cette configuration, toutes les dépendances seront situées dans
/dependency-jars
. Mon application n'a pas deMain
classe, juste des contextes, mais l'une de mes dépendances a uneMain
classe (com.myDomain.etc.MainClassName
) qui démarre le serveur JMX et reçoit unstart
ou unstop
paramètre. Donc, avec cela, j'ai pu démarrer mon application comme ceci:J'attends que ce soit utile pour vous tous.
la source
J'ai comparé les plugins d'arbre mentionnés dans cet article. J'ai généré 2 pots et un répertoire avec tous les pots. J'ai comparé les résultats et le plugin maven-shadow est certainement le meilleur. Mon défi était que j'avais plusieurs ressources de printemps qui devaient être fusionnées, ainsi que des services jax-rs et JDBC. Ils ont tous été fusionnés correctement par le plugin d'ombre en comparaison avec le plugin maven-assembly-plugin. Dans ce cas, le ressort échouera, sauf si vous les copiez dans votre propre dossier de ressources et les fusionnez manuellement une fois. Les deux plugins produisent l'arborescence de dépendances correcte. J'ai eu plusieurs étendues comme tester, fournir, compiler, etc. le test et fourni ont été ignorés par les deux plugins. Ils ont tous deux produit le même manifeste, mais j'ai pu consolider les licences avec le plugin d'ombre à l'aide de leur transformateur. Avec le plugin maven-dependency, bien sûr que vous ne le faites pas t ont ces problèmes car les pots ne sont pas extraits. Mais comme certains l'ont souligné, vous devez transporter un ou plusieurs fichiers supplémentaires pour fonctionner correctement. Voici un aperçu du fichier pom.xml
la source
Quelque chose qui a fonctionné pour moi était:
J'ai eu un cas extraordinaire parce que ma dépendance était un système:
J'ai changé le code fourni par @ user189057 avec des changements: 1) le plugin maven-dependency est exécuté dans la phase "prepare-package" 2) J'extrais directement les classes décompressées vers "target / classes"
la source
J'ai essayé la réponse la plus votée ici et j'ai pu obtenir le pot exécutable. Mais le programme ne s'est pas exécuté correctement. Je ne connais pas la raison. Quand j'essaye de fuir
Eclipse
, j'obtiens un résultat différent, mais lorsque j'exécute le pot à partir de la ligne de commande, j'obtiens un résultat différent (il se bloque avec une erreur d'exécution spécifique au programme).J'avais une exigence similaire à celle de l'OP juste que j'avais trop de dépendances (Maven) pour mon projet. Heureusement, la seule solution qui a fonctionné pour moi était celle de l'utilisation
Eclipse
. Très simple et très simple. Ce n'est pas une solution à l'OP mais c'est une solution pour quelqu'un qui a une exigence similaire mais avec de nombreuses dépendances Maven,1) Cliquez avec le bouton droit sur votre dossier de projet (dans Eclipse) et sélectionnez
Export
2) Sélectionnez ensuite
Java
->Runnable Jar
3) Il vous sera demandé de choisir l'emplacement du fichier jar
4) Enfin, sélectionnez la classe qui a la méthode Main que vous souhaitez exécuter et choisissez
Package dependencies with the Jar file
et cliquez surFinish
la source
Cela pourrait également être une option, vous pourrez créer votre fichier jar
la source
Pour tous ceux qui recherchent des options pour exclure des dépendances spécifiques de l'uber-jar, voici une solution qui a fonctionné pour moi:
Ce n'est donc pas une configuration du mvn-assembly-plugin mais une propriété de la dépendance.
la source
Il y a déjà des millions de réponses, je voulais ajouter que vous n'avez pas besoin
<mainClass>
si vous n'avez pas besoin d'ajouter entryPoint à votre application. Par exemple, les API peuvent ne pas avoir nécessairement demain
méthode.configuration du plugin maven
construire
Vérifier
la source
Ajoutez à pom.xml:
et
C'est ça. Le prochain paquet mvn créera également un gros pot en plus, y compris tous les pots de dépendance.
la source
Le plugin maven-assembly-plug a très bien fonctionné pour moi. J'ai passé des heures avec le plugin maven-dependency et je n'ai pas pu le faire fonctionner. La raison principale était que je devais définir explicitement dans la section de configuration les éléments d'artefact qui devraient être inclus comme cela est décrit dans la documentation . Il y a un exemple pour les cas où vous souhaitez l'utiliser comme:,
mvn dependency:copy
où il n'y a pas d'artefactItems inclus mais cela ne fonctionne pas.la source
Ce billet de blog montre une autre approche avec la combinaison des plugins maven-jar et maven-assembly. Avec le xml de configuration d'assembly du billet de blog, il peut également être contrôlé si les dépendances seront développées ou simplement collectées dans un dossier et référencées par une entrée classpath dans le manifeste:
Et c'est exactement celui-là qui est décrit ici: https://caffebig.wordpress.com/2013/04/05/executable-jar-file-with-dependent-jars-using-maven/
la source
la source
D'accord, c'est donc ma solution. Je sais qu'il n'utilise pas le fichier pom.xml. Mais j'ai eu le problème de compilation et d'exécution de mon programme sur Netbeans mais il a échoué lorsque j'ai essayé Java -jar MyJarFile.jar. Maintenant, je ne comprends pas bien Maven et je pense que cela a eu du mal à obtenir que Netbeans 8.0.2 inclue mon fichier jar dans une bibliothèque pour les mettre dans un fichier jar. Je pensais à la façon dont j'utilisais les fichiers jar sans Maven dans Eclipse.
C'est Maven qui peut compiler toutes les dépendances et tous les plugins. Pas Netbeans. (Si vous pouvez obtenir Netbeans et pouvoir utiliser java .jar pour ce faire, dites-moi comment (^. ^) V)
[Résolu - pour Linux] en ouvrant un terminal.
alors
Prochain
Prochain
Cela créera un fichier jar dans le répertoire cible.
Maintenant
(Vous devrez peut - être exécuter:
chmod +x MyJarFile-1.0-jar-with-dependencies.jar
)et enfin
S'il te plait regarde
https://cwiki.apache.org/confluence/display/MAVEN/LifecyclePhaseNotFoundException
Je publierai cette solution dans quelques autres pages avec un problème similaire. J'espère pouvoir sauver quelqu'un d'une semaine de frustration.
la source