2010-03-01 6 views
36

Ho una dipendenza Maven nel mio pom.xml come tale:Posso usare il percorso di una dipendenza Maven come una proprietà?

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

E vorrei utilizzare il percorso di sistema al binario come una proprietà (in modo da poter passare ad un processo esterno che viene preso a calci fuori da Maven). Posso fare questo in modo imbarazzante:

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

Ma mi piacerebbe davvero utilizzare un meccanismo più standard, come ad esempio:

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

ho qualcosa di simile possibile?

+0

Sono un po 'confuso: se si vuole fare riferimento 'Bar.jar' come una libreria di sistema, è necessario specificare' sistema $ {} my.lib 'ma sembra che si desidera utilizzare' $ {my.lib} 'da qualche altra parte. Mostra l'esempio completo di come vuoi usare '$ {my.lib}' ... –

+1

@dma_k L'OP vuole passare il percorso fisico a una dipendenza a un processo esterno attivato da Maven. –

risposta

36

Supponendo che l'artefatto com.foo:Bar:jar:1.2.3 è dichiarata come dipendenza nel tuo POM, la seguente proprietà restituisce il percorso per il vaso nel repository locale:

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

Aggiornamento: Ecco un semplice POM dimostrando in questo modo:

<?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> 

Esecuzione mvn process-resources produce il seguente output:

 
$ 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

Non riesco a dimostrare questa funzione funziona in Maven. Questo funziona solo con 'maven-antrun-plugin' (vedi http://jira.codehaus.org/browse/MANTRUN-110). Per favore, fornire un esempio pom completo, come suppongo, non si fa riferimento a '' ma alcune altre proprietà. –

+0

@dma_k Il problema di Jira di cui si sta parlando non mostra nulla tranne che c'era un bug nella documentazione di Antrun. Ora, sentiti libero di testare questa soluzione da solo. E a proposito, cerco sempre le mie risposte :) –

+0

@Pascal Grazie per l'aggiornamento! Mi fido completamente di te, che funzioni nel tuo sito :) La mia domanda era: si suppone che funzioni in combinazione con 'maven-antrun-plugin'. E lo mostri nel tuo esempio, fantastico! E dall'esempio vedo che questa è la caratteristica 'maven-antrun-plugin', cioè se voglio sostituire la variabile' $ {my.lib} 'per le risorse (senza usare pugin aggiuntivi) - Non posso farlo, giusto ? –

0

È necessario scrivere un nuovo plug-in Maven che imposta un valore di proprietà sul nome di percorso completamente risolto di una dipendenza. Il plugin maven-dependency non lo farà per te.

Sarà copia la dipendenza da qualche parte e quindi è possibile fare riferimento ad esso da quel percorso.

47

Ecco una corretta attuazione, utilizzando il maven-dependency-plugin properties goal, che può essere utilizzato ovunque in un 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> 

e l'uscita è ...

[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

Questo ha funzionato perfettamente per me. Grazie per il post! – kurzweil4

+0

Potrebbe essere meno confuso se il tuo esempio usasse una dipendenza diversa. Per chi fosse interessato, se avevi bisogno il vaso per JMockit, la vostra proprietà sarebbe come questo: $ {org.jmockit: JMockit: jar} Vale a dire: $ {GroupID: artifactId: jar} – kurzweil4

+0

buon punto, modificato. –

1

Se nessuno dei lavori superiore , puoi sempre utilizzare gmaven per immergersi aggressivamente nell'oggetto MavenProject e ottenere le informazioni sugli artefatti. Nel mio caso, ho avuto il seguente manufatto dichiarato in un profilo:

  <!-- 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> 

per ottenere il suo percorso e metterlo in una proprietà Maven, ho scritto il seguente script gmaven:

   <!-- 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> 

E 'una specie del metodo a forza bruta, ma funziona molto meglio delle soluzioni precedenti che ho visto lì.

Problemi correlati