J’ai déjà trouvé une réponse sur Stack Overflow pour inclure un fichier JAR tiers dans un projet sans l’installer dans un “référentiel local”:
Puis-je append des fichiers jars à maven 2 build classpath sans les installer?
Mais lorsque j’utilise le plug-in Maven Shade pour créer un fichier JAR qui inclut également toutes les dépendances du projet, le fichier JAR tiers n’est pas inclus automatiquement.
Comment puis-je faire en sorte que Maven Shade Plugin ajoute un tel fichier JAR tiers au fichier JAR ombré?
Selon la réponse obtenue, je l’ai fait fonctionner. Ce que j’ai fait a été d’append cet extrait au début de mon fichier pom.xml:
repo file://${basedir}/repo
Puis ajouté une dépendance pour mon projet, également à pom.xml:
dummy dummy 0.0.0 comstack
Et puis couru une ligne de commande pour append un paquet à ‘repo’:
mvn org.apache.maven.plugins:maven-install-plugin:2.3.1:install-file -Dfile=.jar -DgroupId=dummy -DartifactId=dummy -Dversion=0.0.0 -Dpackaging=jar -DlocalRepositoryPath=`pwd`/repo/
(Je ne sais pas si le chemin du repo doit être un chemin complet, mais je ne voulais pas prendre de risques.)
Le contenu du sous-répertoire repo est maintenant:
repo/dummy/dummy/0.0.0/dummy-0.0.0.jar repo/dummy/dummy/0.0.0/dummy-0.0.0.pom repo/dummy/dummy/maven-metadata-local.xml
Maintenant, je peux vérifier cela dans le contrôle de version et ne pas avoir de dépendances locales ou distantes.
Toutefois, lorsque j’utilise le plug-in Maven Shade pour créer un fichier JAR incluant également toutes les dépendances du projet, le fichier JAR tiers n’est pas inclus automatiquement.
Oui, car les dépendances étendues du system
sont supposées être toujours présentes (c’est exactement ce que concerne la scope du system
), elles ne seront donc pas incluses. En fait, les gens ne comprennent pas ce que sont les dépendances de la scope du system
, ils continuent à en abuser (oui, il s’agit d’abus), puis à obtenir des effets secondaires et à se demander pourquoi.
J’ai déjà écrit beaucoup , beaucoup , beaucoup de fois à ce sujet ici sur SO et dans 99% des cas, les dépendances étendues au system
devraient être évitées. Et je vais répéter ce que le mini-guide Dependency Scopes dit encore une fois:
system
: cette dépendance est requirejse dans certaines phases du cycle de vie de votre projet, mais est spécifique au système. L’utilisation de cette scope est déconseillée: ceci est considéré comme un type de fonctionnalité “avancée” et ne devrait être utilisé que lorsque vous comprenez vraiment toutes les ramifications de son utilisation, ce qui peut être extrêmement difficile, voire impossible à quantifier. Cette scope par définition rend votre build non portable. Cela peut être nécessaire dans certains cas de bord. La scope du système inclut l’élémentqui pointe vers l’emplacement physique de cette dépendance sur la machine locale. Il est donc utilisé pour faire référence à un artefact supposé être présent sur la machine locale donnée et non dans un référentiel; et dont le chemin peut varier d’une machine à l’autre. L’élément systemPath peut faire référence à des variables d’environnement dans son chemin:
${JAVA_HOME}
par exemple.
Donc, au lieu d’utiliser la scope du system
, soit:
install:install-file
. C’est un moyen rapide et sale de faire fonctionner les choses, cela peut être une option si vous êtes seul, mais cela rend votre construction non portable. deploy:deploy-file
. C’est le scénario idéal . S’il vous plaît, arrêtez d’utiliser l’étendue du system
.
Le plugin Maven addjars résout ce problème – voir
http://code.google.com/p/addjars-maven-plugin/wiki/UsagePage
Utilisé
${project.basedir} lib/*.jar org.apache.maven.plugins maven-shade-plugin 2.3 false package shade