Maven 2 assemblage avec dépendances: jar sous périmètre “system” non inclus

J’utilise le plugin maven-assembly pour créer un fichier jar de mon application, y compris ses dépendances comme suit:

 macosx  tar.gz dir     *:jar  lib    

(J’ai omis d’autres choses qui ne sont pas liées à la question)

Jusqu’à présent, cela a bien fonctionné car il crée un répertoire lib avec toutes les dépendances. Cependant, j’ai récemment ajouté une nouvelle dépendance dont la scope est le system , et elle ne la copie pas dans le répertoire de sortie de la lib . Je dois manquer quelque chose de fondamental ici, alors je demande de l’aide.

La dépendance que je viens d’append est la suivante:

  sourceforge.jchart2d jchart2d 3.1.0 system ${project.basedir}/external/jchart2d-3.1.0.jar  

La seule façon d’inclure cette dépendance était d’append l’élément suivant à l’élément assembly:

   external/jchart2d-3.1.0.jar lib   

Cependant, cela me force à changer le fichier pom et l’assembly chaque fois que ce fichier est renommé, si jamais. En outre, il semble juste faux.

J’ai essayé avec runtime dans les ensembles de dependencySets et sourceforge.jchart2d:jchart2d sans succès.

Alors, comment est-ce que vous incluez un pot de scope system dans votre fichier d’assemblage dans maven 2?

Merci beaucoup

Je ne suis pas surpris que les dépendances de la scope du système ne soient pas ajoutées (après tout, les dépendances avec une scope du système doivent être explicitement fournies par définition). En fait, si vous ne voulez vraiment pas placer cette dépendance dans votre référentiel local (par exemple parce que vous souhaitez le dissortingbuer dans le cadre de votre projet), voici ce que je ferais:

  • Je mettrais la dépendance dans un “référentiel de système de fichiers” local au projet.
  • Je déclarerais ce repository dans mon pom.xml comme ceci:

       my file://${basedir}/my-repo   
  • Je voudrais simplement déclarer l’artefact sans l’étendue du system , c’est juste une source de problèmes:

      sourceforge.jchart2d jchart2d 3.1.0  

Je ne suis pas sûr à 100% que cela conviendra à vos besoins, mais je pense que c’est une meilleure solution que d’utiliser l’étendue du système.

Mise à jour: J’aurais dû le mentionner dans ma réponse originale et je le répare maintenant. Pour installer une bibliothèque tierce dans le référentiel basé sur des fichiers, utilisez install:install-file avec le paramètre localRepositoryPath :

 mvn install:install-file -Dfile= \ -DgroupId= \ -DartifactId= \ -Dversion= \ -Dpackaging= \ -DlocalRepositoryPath= 

Vous pouvez le coller tel quel dans un shell * nix. Sur Windows, supprimez le ” \ ” et mettez tout sur une seule ligne.

Btw vous pouvez l’automatiser et en faire une partie de votre build Maven. Ce qui suit va installer votre jar dans votre repository local avant la compilation:

   org.apache.maven.plugins maven-install-plugin   hack-binary validate  ${basedir}/lib/your-lib.jar default your-group your-artifact 0.1 jar true   install-file     

Je trouve une solution facile au cas où tu créerais un pot

  org.apache.maven.plugins maven-war-plugin 2.1.1    dependencies/mydep WEB-INF/lib true  **/*.jar      

Vous pouvez également gérer cela en ajoutant un dependencySet supplémentaire dans vos ensembles de dépendances.

  system  *:jar  lib  

La meilleure chose serait d’utiliser un gestionnaire de référentiel (comme Nexus, Artifactory, Archiva) et d’installer ce type de dépendance dans un référentiel particulier. Après cela, vous pouvez utiliser des choses comme une dépendance simple. Cela vous simplifiera la vie.

Docs: https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html

Une solution simple consiste à l’append au repository local maven.

Une des façons de le faire est d’utiliser les commandes mvn install, comme suggéré dans le post précédent.

Un autre moyen facile est 1) Dans votre eclipse ide, cliquez avec le bouton droit sur le projet, sélectionnez l’option Maven. 2) Sélectionnez Installer ou déployer un artefact dans une option de référentiel Maven et cliquez sur Suivant. 3) Cliquez sur Parcourir à côté de la case à cocher Fichier d’artefacts et sélectionnez votre fichier jar 4) Entrez GroupId et ArtifactId et assurez-vous que la version génère pom et crée la sum de contrôle est cochée

Cliquez sur Terminer, Wallah !!! votre travail est terminé le jar est ajouté dans votre référentiel local que vous pouvez définir dans le répertoire setting.xml ou m2

Maintenant, ajoutez simplement la dépendance maven simple selon la version de GroupId, ArtifactId & jar que vous avez entrée comme pour l’importation et c’est votre jar externe qui sera empaqueté par maven.

Édité: Désolé que je n’ai pas réalisé qu’alx a également mentionné le contournement du cycle de vie propre.

  org.apache.maven.plugins maven-install-plugin   hack-binary clean  ${basedir}/lib/your-lib.jar default your-group your-artifact 0.1 jar true   install-file     

Basé sur la solution fournie par alx, vous pouvez exécuter l’étape d’installation du fichier à la phase de nettoyage. mais comme la phase de nettoyage n’est pas dans le cycle de vie par défaut, vous devez exécuter mvn clean pour la première fois pour vous assurer que le mvn clean jar est prêt dans le référentiel local.

ex: mvn clean; paquet mvn

cela a fonctionné plus facilement sur ma solution:

retirer de votre dépendance:

  tiago.medici eureka 0.0.1  

Ensuite, ajoutez également le plug-in maven-install dans le fichier pom.xml.

  org.apache.maven.plugins maven-install-plugin   install-external clean  ${basedir}/external/tiago.medici-0.0.1.jar default tiago.medici eureka 0.0.1 jar true   install-file