2010-03-01 4 views
36

J'ai une dépendance Maven dans mon pom.xml en tant que tel:Puis-je utiliser le chemin vers une dépendance Maven en tant que propriété?

<dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>Bar</artifactId> 
    <version>1.2.3</version> 
</dependency> 

Et je voudrais utiliser le chemin du système binaire comme une propriété (je peux passer à un processus externe qui est lancé fermé par maven). Je peux le faire de façon maladroite:

<properties> 
    <my.lib>${settings.localRepository}/com/foo/Bar/1.2.3/Bar.jar</my.lib> 
</properties> 

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

<properties> 
    <my.lib>${com.foo:Bar:1.2.3}</my.lib> 
</properties> 

je quelque chose comme ça possible?

+0

Je suis un peu confus: si vous voulez faire référence 'Bar.jar' en tant que bibliothèque système, vous devez spécifier' système $ {} my.lib ', mais il semble que vous voulez utiliser' $ {my.lib} 'ailleurs. Montrez l'exemple complet de la façon dont vous voulez utiliser '$ {my.lib}' ... –

+1

@dma_k L'OP veut passer le chemin physique à une dépendance à un processus externe déclenché par maven. –

Répondre

36

En supposant que l'artefact com.foo:Bar:jar:1.2.3 est déclarée comme dépendance dans votre POM, la propriété suivante renvoie le chemin du pot dans le référentiel local:

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

Mise à jour: Voici un POM simple démonstration de ceci:

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow</groupId> 
    <artifactId>q2359872</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <name>q2359872</name> 
    <properties> 
    <my.lib>${maven.dependency.junit.junit.jar.path}</my.lib> 
    </properties> 
    <dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
    </dependencies> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <executions> 
      <execution> 
      <phase>process-resources</phase> 
      <configuration> 
       <tasks> 
       <echo>${my.lib}</echo> 
       </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

Exécution mvn process-resources produit la sortie suivante:

 
$ mvn process-resources 
[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building q2359872 
[INFO] task-segment: [process-resources] 
[INFO] ------------------------------------------------------------------------ 
[INFO] [resources:resources {execution: default-resources}] 
[INFO] Using 'UTF-8' encoding to copy filtered resources. 
[INFO] skip non existing resourceDirectory /home/pascal/Projects/stackoverflow/q2359872/src/main/resources 
[INFO] [antrun:run {execution: default}] 
[INFO] Executing tasks 
    [echo] /home/pascal/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar 
[INFO] Executed tasks 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESSFUL 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 7 seconds 
[INFO] Finished at: Tue Mar 02 14:41:32 CET 2010 
[INFO] Final Memory: 7M/68M 
[INFO] ------------------------------------------------------------------------ 
+1

Je ne peux pas prouver que cette fonctionnalité fonctionne dans Maven. Cela ne fonctionne que pour 'maven-antrun-plugin' (voir http://jira.codehaus.org/browse/MANTRUN-110). S'il vous plaît, fournissez un exemple complet de pom, comme je suppose, vous référez pas '' mais d'autres propriétés. –

+0

@dma_k Le problème de Jira que vous mentionnez ne montre rien sauf qu'il y avait un bug dans la documentation d'antrun. Maintenant, n'hésitez pas à tester cette solution vous-même. Et BTW, je teste toujours mes réponses :) –

+0

@Pascal Merci pour la mise à jour! Je vous fais entièrement confiance, que cela fonctionne sur votre site :) Ma question était: est-ce censé fonctionner en combinaison avec 'maven-antrun-plugin'. Et vous le montrez dans votre exemple, génial! Et à partir de l'exemple, je vois que c'est une fonctionnalité spécifique 'maven-antrun-plugin', ie si je veux substituer la variable' $ {my.lib} 'pour les ressources (sans utiliser de pugin supplémentaire) - je ne peux pas le faire, ? –

0

Vous devez écrire un nouveau plugin maven qui définit une valeur de propriété pour le chemin complet d'une dépendance. Le plugin maven-dependency ne le fera pas pour vous.

Il va copier votre dépendance quelque part et alors vous pouvez vous y référer par ce chemin.

47

Voici une mise en œuvre correcte, en utilisant le maven-dependency-plugin properties goal, qui peut être utilisé partout dans une pom:

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.stackoverflow</groupId> 
    <artifactId>q2359872</artifactId> 
    <version>2.0-SNAPSHOT</version> 
    <name>q2359872</name> 

    <properties> 
     <!-- Must be listed in the dependencies section otherwise it will be null. --> 
     <my.lib>${org.jmockit:jmockit:jar}</my.lib> 
    </properties> 
    <dependencies> 
     <dependency> 
      <groupId>org.jmockit</groupId> 
      <artifactId>jmockit</artifactId> 
      <version>1.11</version> 
     </dependency> 
    </dependencies> 
    <build> 
     <defaultGoal>generate-sources</defaultGoal> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.3</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>properties</goal> 
         </goals> 
        </execution> 
       </executions> 
      </plugin> 
      <!-- Example usage: --> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>exec-maven-plugin</artifactId> 
       <version>1.2</version> 
       <executions> 
        <execution> 
         <goals> 
          <goal>exec</goal> 
         </goals> 
         <phase>generate-sources</phase> 
        </execution> 
       </executions> 
       <configuration> 
        <executable>echo</executable> 
        <arguments> 
         <argument>path to jar=</argument> 
         <argument>${org.jmockit:jmockit:jar}</argument> 
         <argument>my.lib=</argument> 
         <argument>${my.lib}</argument> 
        </arguments> 
       </configuration> 
      </plugin> 
      <!-- end of Example usage --> 
     </plugins> 
    </build> 
</project> 

Et la sortie est ...

[email protected] /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] ------------------------------------------------------------------------ 
+2

Cela a fonctionné parfaitement pour moi. Merci pour le post! – kurzweil4

+0

Cela pourrait être moins déroutant si votre exemple utilisait une dépendance différente. Pour les intéressés, si vous avez besoin pour le pot JMockit, votre propriété serait comme ceci: $ {org.jmockit: jmockit: pot} Cela revient à dire: $ {groupId: artifactId: jar} – kurzweil4

+0

bon point, édité. –

1

Si aucun des travaux supérieur , vous pouvez toujours utiliser gmaven pour plonger agressivement dans l'objet MavenProject et obtenir vos infos artefact. Dans mon cas, j'ai eu l'artefact suivant déclaré dans un profil:

  <!-- Neo4J connector. This dependency is scoped to be usable by maven-exec-plugin 
       which installs it in Glassfish --> 
      <dependency> 
       <groupId>com.netoprise</groupId> 
       <artifactId>neo4j-connector</artifactId> 
       <version>${neo4j.connector.version}</version> 
       <type>rar</type> 
       <!-- Set in test scope to avoid release issues --> 
       <scope>test</scope> 
      </dependency> 

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

   <!-- Small script used to build maven property for neo4j-connector path --> 
       <plugin> 
        <groupId>org.codehaus.gmaven</groupId> 
        <artifactId>gmaven-plugin</artifactId> 
        <version>1.3</version> 
        <executions> 
         <execution> 
          <id>get-neo4j-connector-rar-path</id> 
          <phase>validate</phase> 
          <goals> 
           <goal>execute</goal> 
          </goals> 
          <configuration> 
           <source> 
            <![CDATA[ 
println "initial value of neo4j.connector.rarPath is \""+project.properties['neo4j.connector.rarPath']+"\""        

// Duplicate model in a Mavenproject, allowing me to get associated artifact 
// So sad I can't get the embdder object 

// More info here : http://maven.apache.org/ref/3.0.3/maven-core/apidocs/org/apache/maven/project/MavenProject.html 
def mavenProject = new org.apache.maven.project.MavenProject(project) 

// More infos on Artifact there : http://maven.apache.org/ref/3.0.3/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.html 
def neo4jConnector = mavenProject.getArtifacts().find { artifact -> artifact.getArtifactId()=='neo4j-connector' } 
// Now resolve dependency to produce an artifact 
// notice maven property interpolation doesn't do toString, 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'] 

            ]]> 
           </source> 
          </configuration> 
         </execution> 
        </executions> 
       </plugin> 

Il est une sorte de la méthode brute-force, mais cela fonctionne beaucoup mieux que les solutions précédentes que j'ai vu là-bas.

Questions connexes