Dependencia de Maven WAR

82

Estoy escribiendo un proyecto para pruebas de aceptación y, por varias razones, esto depende de otro proyecto empaquetado como WAR. Me las arreglé para descomprimir el WAR usando el complemento maven-dependency-plugin, pero no puedo hacer que mi proyecto incluya el desempaquetado WEB-INF/lib/*.jary WEB-INF/classes/*se incluya en la ruta de clase, por lo que la compilación falla. ¿Hay alguna forma de incluir estos archivos en la ruta de clases, o hay una mejor manera de depender de un WAR?

Muchas gracias.

deelo55
fuente

Respuestas:

115

Hay otra opción desde maven-war-plugin 2.1-alpha-2. En su proyecto WAR:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <attachClasses>true</attachClasses>
    </configuration>
</plugin>

Esto crea un artefacto de clases que puede usar en el proyecto de pruebas de aceptación con:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>
Christoph Leiter
fuente
6
El único problema con esto para mí es que no
genera
1
Sí, gracias por esta pista :) Me funcionó parcialmente. Con la línea de comandos de Maven, todo está bien. Con maven en eclipse (m2e), la compilación de pruebas que hacen referencia a clases en la guerra también está bien, pero cuando intento ejecutar las pruebas (junit) tengo que desactivar la resolución del espacio de trabajo m2e para que funcione. De lo contrario, la ejecución junit arrojará una ClassNotFoundException para las clases referenciadas de la guerra. De alguna manera, esos no están incluidos en la ruta de clase de ejecución de junit, aunque el proyecto de guerra se enumera en la biblioteca de dependencias de maven en la ruta de construcción del proyecto. ¿Alguna idea?
Gandalf
1
Puede agregar el pom de la dependencia como dependencia del proyecto para obtener dependencias transitivas. Entonces obtienes una dependencia de las clases y del pom
Jonatan Cloutier
Tenga en cuenta que este complemento debe ir a la configuración de <build> del pom.
MichaelCleverly
En mi caso, necesitaba src / main / resources / * y también están incluidos en "-classes.jar" - ¡genial!
Jonas Berlin
24

De hecho, por diseño, Maven no resuelve las dependencias transitivas de una guerra declarada como dependencia de un proyecto. En realidad, hay un problema al respecto, MNG-1991 , pero no se resolverá en Maven 2.xy no estoy seguro de no saber si las superposiciones permiten solucionar este problema. Mi comprensión de la solución sugerida es duplicar las dependencias, por ejemplo, en un proyecto de tipo pom.


(EDITAR: Después de investigar un poco más, encontré algo interesante en este hilo que cito a continuación:

He estado ayudando con el desarrollo del proyecto AppFuse durante el último mes, donde hacemos un uso intensivo de la función de superposición de guerra en el complemento de guerra de Maven. ¡Es una característica realmente ingeniosa!

Para obtener el máximo poder con superposiciones de guerra, he desarrollado el complemento Warpath que permite que los proyectos utilicen artefactos de guerra como dependencias completas. En breve:

1) El contenido del directorio / WEB-INF / classes en los artefactos de dependencia de guerra se puede incluir en la ruta de clases del proyecto para tareas normales de compilación, etc.
2) Las dependencias transitivas de los artefactos de dependencia de guerra están disponibles para su uso por otros complementos, por ejemplo, compilación y oído, ¡así que ya no tendrá que incluir todas las dependencias al crear guerras delgadas!

El complemento ahora se ha utilizado activamente en el proyecto AppFuse durante los últimos meses, y creo que está en un punto en el que es utilizable y estable. ¿Estaría interesado el equipo del complemento de guerra en incluir la funcionalidad warpath dentro del complemento de guerra? Parece ser el lugar más natural para albergarlo.

Por lo tanto, no tengo ninguna experiencia con él, pero el complemento warpath de maven en realidad se ve agradable y simple y está disponible en el repositorio central. Para usarlo, incluya el siguiente elemento de configuración del complemento en su pom.xmlarchivo:

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.appfuse</groupId>
      <artifactId>maven-warpath-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>add-classes</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

Y agregue las dependencias de guerra que desee incluir en el classpath como dependencias de tipo warpath :

[...]
<dependencies>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>war</type>
  </dependency>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>warpath</type>
  </dependency>
</dependencies>
[...]

Se necesitan los tipos de dependencia war y warpath: el tipo war lo usa el complemento war de Maven para realizar la superposición de guerra, el tipo warpath lo usa el complemento Warpath para determinar la lista correcta de artefactos para su inclusión en la ruta de clases del proyecto.

Lo intentaría.)

Pascal Thivent
fuente
1
Pascal, en mi proyecto tengo módulos separados para ejecutar la prueba de integración en diferentes servidores (cada módulo para un servidor). Estos módulos de prueba tienen clases de prueba y utilizan la dependencia de guerra y superposiciones. Funciona muy bien.
cetnar
Bueno, como escribí, no estaba seguro, así que gracias por esos comentarios, es bueno saberlo. ¿Puede simplemente confirmar que funciona con las dependencias transitivas de una guerra y no solo con las clases Java de la guerra?
Pascal Thivent
OK gracias. Veo cómo funciona ahora (la parte importante es su segunda oración: su proyecto de prueba debe tener también empaquetado de guerra ).
Pascal Thivent
1
El problema que tengo con este complemento es que no es compatible con m2eclipse: maven.40175.n5.nabble.com/…
milán
Este complemento también rompe tanto el lanzamiento de Maven como los complementos de ensamblaje porque ambos intentarán resolver las dependencias de un WAR que usa el complemento warpath, Maven se romperá diciendo que no puede resolver la dependencia type = warpath. Lástima que no funcione.
HDave el
14

Utilice superposiciones . Primero, su proyecto de prueba debe tener también empaquewar .

Declare la dependencia del proyecto de guerra que desea probar:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>

luego configure la superposición de maven-war-plugin:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webresources</directory>
                    <filtering>true</filtering>
                </resource>
            </webResources>
            <overlays>
                <overlay/>
                <overlay>
                    <groupId>your.group</groupId>
                    <artifactId>your-project-artifactId</artifactId>
                </overlay>
            </overlays>
        </configuration>
    </plugin>

En el ejemplo anterior en el proyecto de prueba, sobrescribo los archivos de configuración de recursos web (como conxtext, etc.).

EDITAR: esta solución no se probó con Maven 3.

cetnar
fuente
1
Voté esto antes de probarlo. No sé si esto se debe a que estoy usando Maven3, pero de hecho, mis carpetas / classes y / lib se incluyen de forma transitiva a través de múltiples dependencias WAR. Nuevamente, perdón por rechazarlo. Aparentemente, esta es la respuesta "correcta".
HDave el
4

Buen punto, Justin. Eso me hizo realmente resolver mi problema, a saber: incluir una guerra en una asamblea Y todas sus dependencias transitivas. No pude duplicar la dependencia de guerra como 'jar' como sugirió, ya que el complemento de ensamblaje no encontraría un jar al que hace referencia ese groupId / artefactId, pero

  • duplicando la dependencia de guerra como tipo pom

¡trabajos! La guerra y sus dependencias transitivas no se incluyen en la asamblea. Para excluir el archivo pom (que ahora también aparece), tuve que agregar un elemento de exclusión como este:

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

en mi archivo assembly.xml.

Creo que esto también podría ser una solución para la pregunta original de este hilo.

Niels
fuente
-1

Si enumera la dependencia en el proyecto de guerra como una dependencia de jar, parece recoger los jar / recursos necesarios. Estoy usando Maven 2.2 + m2eclipse.

Justin
fuente