tutorial sts que proyecto pom plugin español desde crear consola configurar comandos maven-2

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.



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