Puis-je utiliser le chemin d’access à une dépendance de Maven en tant que propriété?

J’ai une dépendance Maven dans mon pom.xml en tant que tel:

 com.foo Bar 1.2.3  

Et je voudrais utiliser le chemin du système vers le binary en tant que propriété (afin que je puisse le transmettre à un processus externe lancé par maven). Je peux le faire d’une manière maladroite:

  ${settings.localRepository}/com/foo/Bar/1.2.3/Bar.jar  

Mais je voudrais vraiment utiliser un mécanisme plus standard, tel que:

  ${com.foo:Bar:1.2.3}  

J’ai quelque chose comme ça possible?

En supposant que l’artefact com.foo:Bar:jar:1.2.3 est déclaré en tant que dépendance dans votre POM, la propriété suivante renvoie le chemin d’access au com.foo:Bar:jar:1.2.3 dans le référentiel local:

 ${maven.dependency.com.foo.Bar.jar.path} 

Mise à jour: Voici un simple POM démontrant ceci:

   4.0.0 com.stackoverflow q2359872 1.0-SNAPSHOT q2359872  ${maven.dependency.junit.junit.jar.path}    junit junit 3.8.1 test      maven-antrun-plugin   process-resources   ${my.lib}    run        

L’exécution de mvn process-resources génère la sortie suivante:

 $ mvn process-resources
 [INFO] Recherche de projets ...
 [INFO] ----------------------------------------------- -------------------------
 [INFO] Bâtiment q2359872
 [INFO] segment de tâche: [ressources-processus]
 [INFO] ----------------------------------------------- -------------------------
 [INFO] [ressources: ressources {exécution: ressources par défaut}]
 [INFO] Utilisation de l'encodage 'UTF-8' pour copier des ressources filtrées.
 [INFO] ignore le ResourceDirectory / home / pascal / Projects / stackoverflow / q2359872 / src / main / resources non existant
 [INFO] [antrun: lance {execution: default}]
 [INFO] Exécution des tâches
      [echo] /home/pascal/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
 [INFO] Tâches exécutées
 [INFO] ----------------------------------------------- -------------------------
 [INFO] CONSTRUIRE UNE RÉUSSITE
 [INFO] ----------------------------------------------- -------------------------
 [INFO] Temps total: 7 secondes
 [INFO] Terminé à: Mar Mar 02 14:41:32 CET 2010
 [INFO] Mémoire finale: 7M / 68M
 [INFO] ----------------------------------------------- -------------------------

Voici une implémentation correcte, en utilisant l’ objective de propriétés maven-dependency-plugin , qui peut être utilisé n’importe où dans un pom:

   4.0.0 com.stackoverflow q2359872 2.0-SNAPSHOT q2359872   ${org.jmockit:jmockit:jar}    org.jmockit jmockit 1.11    generate-sources   org.apache.maven.plugins maven-dependency-plugin 2.3    properties       org.codehaus.mojo exec-maven-plugin 1.2    exec  generate-sources    echo  path to jar= ${org.jmockit:jmockit:jar} my.lib= ${my.lib}        

Et la sortie est …

 jpyeron@black /projects/wkspc/tmp/foo $ /cygdrive/c/programs.x86_64/apache-software-foundation/apache-maven-3.1.1/bin/mvn [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building q2359872 2.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- maven-dependency-plugin:2.3:properties (default) @ q2359872 --- [INFO] [INFO] --- exec-maven-plugin:1.2:exec (default) @ q2359872 --- path to jar= C:\Documents and Settings\jpyeron\.m2\repository\org\jmockit\jmockit\1.11\jmockit-1.11.jar my.lib= C:\Documents and Settings\jpyeron\.m2\repository\org\jmockit\jmockit\1.11\jmockit-1.11.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.032s [INFO] Finished at: Wed Sep 17 12:07:18 EDT 2014 [INFO] Final Memory: 10M/153M [INFO] ------------------------------------------------------------------------ 

Il y a un plugin qui pourrait être ce que vous cherchez … bitssortingngs.org (home) .

Si rien ne fonctionne, vous pouvez toujours utiliser gmaven pour plonger de manière MavenProject dans l’object MavenProject et obtenir vos informations d’artefact. Dans mon cas, l’artefact suivant a été déclaré dans un profil:

    com.netoprise neo4j-connector ${neo4j.connector.version} rar  test  

Pour obtenir son chemin et le mettre dans une propriété Maven, j’ai écrit le script gmaven suivant:

    org.codehaus.gmaven gmaven-plugin 1.3   get-neo4j-connector-rar-path validate  execute     artifact.getArtifactId()=='neo4j-connector' } // Now resolve dependency to produce an artifact // notice maven property interpolation doesn't do toSsortingng, so we have to do it ourselves project.properties['neo4j.connector.rarPath'] = neo4jConnector.getFile().getAbsolutePath() println "usable neoj4Connector can be found at "+project.properties['neo4j.connector.rarPath'] ]]>      

C’est une sorte de méthode par force brute, mais cela fonctionne bien mieux que les solutions précédentes que j’ai vues là-bas.

Vous devez écrire un nouveau plug-in maven qui définit une valeur de propriété sur le chemin d’access entièrement résolu d’une dépendance. Le plugin maven-dependency ne le fera pas pour vous.

Il copiera votre dépendance quelque part et vous pourrez vous y référer par ce chemin.