maven-2 - sts - maven tutorial español pdf
¿Puedo usar la ruta a una dependencia de Maven como una propiedad? (5)
Aquí hay una implementación correcta, utilizando el objetivo de propiedades maven-dependency-plugin , que se puede usar en cualquier parte 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 ...
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] ------------------------------------------------------------------------
Tengo una dependencia de maven en mi pom.xml como tal:
<dependency>
<groupId>com.foo</groupId>
<artifactId>Bar</artifactId>
<version>1.2.3</version>
</dependency>
Y me gustaría usar la ruta del sistema al binario como una propiedad (para poder pasarlo a un proceso externo que inicia maven). Puedo hacer esto de una manera incómoda:
<properties>
<my.lib>${settings.localRepository}/com/foo/Bar/1.2.3/Bar.jar</my.lib>
</properties>
Pero realmente me gustaría usar un mecanismo más estándar, como por ejemplo:
<properties>
<my.lib>${com.foo:Bar:1.2.3}</my.lib>
</properties>
¿Algo así es posible?
Debe 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.
Copiará su dependencia en algún lugar y luego puede referirse a ella por ese nombre de ruta.
Hay un plugin que podría ser lo que estás buscando ... bitstrings.org (home) .
Si no tiene ninguno de los trabajos superiores, siempre puede usar gmaven para sumergirse agresivamente en el objeto MavenProject
y obtener sus infos de artefactos. En mi caso, tuve el siguiente artefacto declarado 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 obtener su ruta y ponerlo en una propiedad maven, escribí 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 algún tipo de método de fuerza bruta, pero SI funciona mucho mejor que las soluciones anteriores que he visto allí.
Suponiendo que el artefacto com.foo:Bar:jar:1.2.3
se declara como dependencia en su POM, la siguiente propiedad devuelve la ruta al jar en el repositorio local:
${maven.dependency.com.foo.Bar.jar.path}
Actualización: Aquí hay un POM simple que demuestra esto:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.</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>
La ejecución de 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//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] ------------------------------------------------------------------------