2009-10-16 23 views
9

(Ver ediciones más adelante.)Maven antRun y ​​sus dependencias

La razón por la que no puedo utilizar la ruta de clases, es porque necesito para gestionar algunas bibliotecas no son Java, y estoy compilando un no proyecto java.

Estoy tratando de utilizar las dependencias de Maven en una llamada antRun, a raíz de la documentación en el sitio experta:

http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html

En la parte inferior de la página:

<property name="mvn.dependency.jar" 
     refid="maven.dependency.my.group.id:my.artifact.id:classifier:jar.path"/> 
<echo message="My Dependency JAR-Path: ${mvn.dependency.jar}"/> 

que pueda No hago que esto funcione, no importa cómo lo intente. He intentado con $ {} alrededor de los contenidos refinados, he intentado dos puntos, puntos, etc. como separadores de todas las formas en que puedo pensar.

¿Alguien puede decirme qué debería decir ese refid realmente para una dependencia común?

EDIT:

Gracias por su respuesta.

Usando su ejemplo SingleShot, Tengo el siguiente:

<plugins> 
    <plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-antrun-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>create-messages</id> 
     <phase>compile</phase> 
     <configuration> 
      <tasks> 
      <property name="build.compiler" value="extJavac"/> 
      <property name="compile_classpath" refid="maven.compile.classpath"/> 
      <property name="runtime_classpath" refid="maven.runtime.classpath"/> 
      <property name="test_classpath" refid="maven.test.classpath"/> 
      <property name="plugin_classpath" refid="maven.plugin.classpath"/> 

      <property name="log4j.jar" refid="log4j:log4j:jar"/> 
      <echo message="Where is the Log4J JAR?: ${log4j.jar}"/> 
      </tasks> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    <dependencies> 
     <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.14</version> 
     </dependency> 
    </dependencies> 
    </plugin> 

Y aquí es lo que me pasa cuando se ejecuta compilación mvn:

[INFO] Scanning for projects... 
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Chat Component 
[INFO] task-segment: [compile] 
[INFO] ------------------------------------------------------------------------ 
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.pom 
2K downloaded 
Downloading: http://<redacted>/content/groups/public/log4j/log4j/1.2.14/log4j-1.2.14.jar 
358K downloaded 
[INFO] [antrun:run {execution: create-messages}] 
[INFO] Executing tasks 
[INFO] ------------------------------------------------------------------------ 
[ERROR] BUILD ERROR 
[INFO] ------------------------------------------------------------------------ 
[INFO] Error executing ant tasks 

Embedded error: Reference log4j:log4j:jar not found. 
[INFO] ------------------------------------------------------------------------ 
[INFO] For more information, run Maven with the -e switch 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 3 seconds 
[INFO] Finished at: Fri Oct 16 14:54:19 PDT 2009 
[INFO] Final Memory: 7M/80M 
[INFO] ------------------------------------------------------------------------ 

EDITAR (2):

Buscando en el código fuente vinculado decidí ejecutar "mvn -X compile" y grep para "Almacenar", lo que da como resultado un montón de salida de registro donde las cosas se están poniendo g almacenado.

De interés son los hechos que la dependencia que especifico explícitamente no se muestra en la lista, y que cuando cambio a una clave basada en una de las entradas I haga vea, sigo teniendo el error.

Respuesta

9

Basándome en el código al que SingleShot se vinculó, y hurgando aleatoriamente hasta que funcionó, así es como obtuve este problema "funcionando", (digo entre comillas porque se siente muy tenue.)

Aquí está la manera de hacer que funcione correctamente:

<property name="log4j_location" 
       value="${maven.dependency.log4j.log4j.jar.path}"/> 
<echo message="${log4j_location}"/> 

Algunas cosas importantes a tener en cuenta: Usted no puede utilizar la dependencia como un experto refid al establecer la propiedad de hormigas. Tienes que usar $ {} para obtener el valor de maven var.

Parece que la dependencia debe estar en la lista de dependencias de nivel superior, lo que hace que log4j una dependencia del complemento antrun no lo exponga al complemento de todas formas que pueda ver.

Todos los separadores de ruta son puntos (.), Sin dos puntos (:) por lo que en última instancia compruebo mi propia respuesta como correcta.

Soapbox:

lo recomiendo encarecidamente cualquiera que esté considerando usar Maven Hormiga con los plugins de Maven o, mejor aún, utilizar Ant con Ivy en su lugar.

Este problema en particular es un ejemplo brillante del nivel de dificultad absolutamente absurdo asociado con hacer algo fuera de lo común con maven.

Digo esto después de haber implementado todo un sistema de compilación basado en Maven2, y también haber implementado varios sistemas de compilación en Ant. He usado tanto Maven2 como Ant con compilaciones complejas que involucran Java, Flex/AS3, C# y C++. Maven tiene sentido para los proyectos Java que tienen no dependencias externas en proyectos en otros idiomas.

Maven aborda algunas cosas que Ant no aborda implícitamente, pero con un poco de planificación inicial, Ant es la herramienta mucho más flexible, mejor documentada y con menos errores.

Si decide ir por la ruta ant, asegúrese de definir una estructura para sus proyectos, descubra su sistema de dependencia (Utilice uno).

Creo que en última instancia serás mucho más feliz que con Maven, ya que no pasarás mucho tiempo tratando de arreglar tu sistema de compilación.

2

Sin un ejemplo de lo que ha escrito en su POM es difícil de decir, pero considere un ejemplo concreto. Digamos que su POM hace referencia a log4j (groupId = log4j, artifactId = log4j). Creo que así es como se haría referencia a que el archivo JAR en Ant:

<property name="log4j.jar" refid="maven.dependency.log4j:log4j:jar.path"/> 
<echo message="Where is the Log4J JAR?: ${log4j.jar}"/> 

Lo ideal es que no debería tener que hacer referencia a los JAR específicos, sino más bien, toda referencia a la ruta de clase para el ámbito apropiado, ya que la documentación algo escasa para el complemento indica.

Si aún tiene problemas, publique la etiqueta <dependency> para una dependencia de Maven POM que está utilizando y puedo intentar ser más específico.

Miré plugin's code para confirmar.

+0

Lo siento. Mi respuesta original falló la "maven.dependency". prefijo y sufijo ".path". Ahora está arreglado y debería funcionar. Mire la línea 87 de la fuente del complemento (vinculada arriba) para ver cómo debería verse. – SingleShot

4

Como una adición a la respuesta anterior de Aaron H., tuve que establecer la versión del complemento en 1.3 para que realmente funcione. Lo estaba usando sin una versión específica y obtenía 1.1 (donde nada parece funcionar).


     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.3</version> 
     ... 
     </plugin> 
+1

Sospecho que la diferencia está en qué repositorio (s) estamos usando. Esto es, imho (O tal vez no tan humilde), solo otro ejemplo de donde "simplemente funciona" se rompe con maven ... –

1

Hay bug in the documentation.La ruta debe ser de la forma:

<property name="mvn.dependency.jar" 
    value="${maven.dependency.my.group.id.my.artifact.id.classifier.jar.path}"/> 

Así que la clave correcta para su dependencia log4j sería:

maven.dependency.log4j.log4j.jar.path 

También tenga en cuenta que debe ser value= en lugar de refid=, por lo que la plena propiedad habría :

<property name="log4j.jar" 
     value="${maven.dependency.log4j.log4j.jar.path}"/> 
<echo message="My Dependency JAR-Path: ${log4j.jar}"/> 
0

Tengo una hormiga existente y planeamos utilizar (nueva) a maven para llamarla. Encontré problemas que quizás no recuerdo bien, pero están relacionados con los patrones de clase, tal vez como los tuyos.

El problema es que la "hormiga" que estamos usando a diario es un script de shell que establece parches de clase, tanto en XNIX como en Windows. No he comparado los parámetros de clase establecidos por él y los que están disponibles para maven, pero mi prueba demostró que no coinciden y la hormiga no se ejecutará con algunas pautas pasadas de maven.

Lo que estoy usando es "exec-maven-plugin" y ejecuto "horm" como un programa externo con algunos argumentos aplicados. Sin duda, esto funciona, pero agrega dependencias adicionales.

2

Esto funciona para mí.

<copy file="${javax.mail:javax.mail-api:jar}" todir="tomcat/lib" /> 
<copy file="${org.springframework:spring-instrument-tomcat:jar}" todir="tomcat/lib" /> 
<copy file="${postgresql:postgresql:jar}" todir="tomcat/lib"/> 

http://maven.apache.org/plugins/maven-antrun-plugin/examples/classpaths.html tiene la explicación de cómo hacer referencia a las dependencias forman la ruta de clases de hormigas.

Cuestiones relacionadas