2010-03-01 16 views
36

tengo una dependencia experto en mi pom.xml como tal:¿Puedo utilizar la ruta a una dependencia de Maven como una propiedad?

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

Y me gustaría utilizar la ruta del sistema al binario como una propiedad (por lo que puedo pasarlo a un proceso externo que se inició fuera por maven). Puedo hacer esto de manera abrupta:

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

Pero realmente me gustaría utilizar un mecanismo más estándar, tales como:

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

que algo así sea posible?

+0

Estoy un poco confundido: si desea hacer referencia 'Bar.jar' como una biblioteca del sistema, es necesario especificar' sistema $ {} MY.LIB 'pero parece que desea utilizar' $ {my.lib} 'en otro lado. Muestre el ejemplo completo de cómo desea usar '$ {my.lib}' ... –

+1

@dma_k El OP quiere pasar la ruta física a una dependencia a un proceso externo desencadenado por maven. –

Respuesta

36

Suponiendo que el com.foo:Bar:jar:1.2.3 artefacto se declara como dependencia en su POM, la propiedad siguiente devuelve la ruta de acceso a la jarra en el repositorio local:

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

Actualización: Aquí es un POM sencilla que demuestra esto:

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

Correr mvn process-resources produce el siguiente resultado:

 
$ 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

No puedo probar que esta característica funcione en Maven. Eso solo funciona para 'maven-antrun-plugin' (ver http://jira.codehaus.org/browse/MANTRUN-110). Por favor, brinde un ejemplo completo de pom, como supongo, usted no refiere '' sino algunas otras propiedades. –

+0

@dma_k El problema de Jira que mencionas no muestra nada, excepto que hubo un error en la documentación de antrun. Ahora, siéntase libre de probar esta solución usted mismo. Y por cierto, siempre pruebo mis respuestas :) –

+0

@Pascal ¡Gracias por la actualización! Confío plenamente en ti, que funciona en tu sitio :) Mi pregunta era: ¿se supone que funciona en combinación con 'maven-antrun-plugin'. Y lo muestras en tu ejemplo, ¡genial! Y por ejemplo, veo que esta es la característica específica de 'maven-antrun-plugin', es decir, si quiero sustituir la variable '$ {my.lib}' por recursos (sin usar ningún pugin adicional) - no puedo hacerlo, a la derecha ? –

0

Necesita escribir un nuevo complemento maven que establezca un valor de propiedad para la ruta de acceso totalmente resuelta de una dependencia. El complemento maven-dependency-no hará eso por ti.

copia su dependencia en algún lugar y luego puede hacer referencia a ella por ese nombre de ruta.

47

Aquí es una aplicación correcta, utilizando el maven-dependency-plugin properties goal, que puede ser utilizado en cualquier lugar de 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> 

Y la salida es ...

[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

Esto funcionó perfectamente para mí. ¡Gracias por la publicacion! – kurzweil4

+0

Puede ser menos confuso si su ejemplo usó una dependencia diferente. Para los interesados, si necesitaba el frasco para JMockit, su propiedad sería así: $ {org.jmockit: jmockit: tarro} Es decir: $ {GROUPID: artifactId: jar} – kurzweil4

+0

buen punto, editado. –

1

Si ninguno de los trabajos superior , siempre puedes usar gmaven para sumergirte agresivamente en el objeto MavenProject y obtener tus infos de artefactos. En mi caso, tuve el siguiente artefacto declarada en un perfil:

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

Para llegar a su paso y la puso en una propiedad experta, me escribió el siguiente 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> 

Es una especie del método de fuerza bruta, pero SI funciona mucho mejor que las soluciones anteriores que he visto allí.

Cuestiones relacionadas