Pregunta Dependencia WAR de Maven


Estoy escribiendo un proyecto para las pruebas de aceptación y, por diversas razones, esto depende de otro proyecto empaquetado como WAR. Logré descomprimir la GUERRA utilizando el complemento maven-dependency-plugin, pero no puedo hacer que mi proyecto incluya el paquete desempaquetado WEB-INF/lib/*.jar y WEB-INF/classes/* para ser incluido en el classpath para que la compilación falle. ¿Hay alguna forma de incluir estos archivos en el classpath, o existe una forma mejor de depender de un WAR?

Muchas gracias.


74
2017-11-20 10:25


origen


Respuestas:


Hay otra opción desde maven-war-plugin 2.1-alpha-2. En tu proyecto de 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>

104
2018-04-10 14:21



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.x y No estoy seguro de que No sé 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.


(EDIT: después de excavar algo más, encontré algo interesante en este hilo que estoy citando a continuación:

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

Para obtener la potencia máxima con superposiciones de guerra, he desarrollado el complemento Warpath   que permite que los proyectos utilicen artefactos de guerra como dependencias de pleno derecho.   En breve:

1) El contenido del directorio / WEB-INF / classes en la dependencia de guerra   los artefactos se pueden incluir en el classpath del proyecto para la compilación normal,   etc tareas
  2) Las dependencias transitivas de los artefactos de dependencia bélica se vuelven   disponible para su uso por otros complementos, p. compila y escucha - así que no más   ¡tener que incluir todas las dependencias al crear guerras flacas!

El complemento se ha utilizado activamente en el proyecto AppFuse para   últimos meses, y creo que es en un punto en el que es utilizable y   estable.   ¿El equipo de plugins de guerra estaría interesado en incluir el warpath?   funcionalidad dentro del plugin war? Parecería ser el más   lugar natural para alojarlo.

Entonces, no tengo ninguna experiencia con eso, pero el maven warpath plugin en realidad se ve bien y simple y está disponible en el repositorio central. Para usarlo, incluya el siguiente elemento de configuración de complemento en su pom.xml archivo:

[...]
<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 classpath como warpath tipo dependencias:

[...]
<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 tanto los tipos de dependencia warpath como warpath: el tipo de war warning es utilizado por el plugin Maven war para hacer war over, el warpath plugin lo usa para determinar la lista correcta de artefactos para su inclusión en el classpath del proyecto.

Yo lo probaría.)


21
2017-11-20 12:24



Utilizar superposiciones. En primer lugar, su proyecto de prueba también debe tener un empaque war.

Declara la dependencia del proyecto de guerra que deseas 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 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 del proyecto de prueba, sobrescribo los archivos de configuración de recursos web (como conxtext, etc.).

EDITAR: Esta solución no fue probada con Maven 3.


12
2017-11-20 11:20



Buen punto, Justin. Eso me ayudó a resolver mi problema, a saber: incluir una guerra en un ensamblado Y incluir todas sus dependencias transitivas. No pude duplicar la dependencia de guerra como 'jar' como sugirió, ya que el plugin de ensamblaje no encontraría un jar referenciado por ese groupId / artefactId, pero

  • duplicar la dependencia de la guerra como tipo pom

¡trabajos! La guerra y sus dependencias transitivas no están incluidas en el conjunto. Para excluir el archivo pom (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.


4
2018-04-22 16:18



Si enumera la dependencia del proyecto war como una dependencia de jar, parece recoger los jars / resources necesarios. Estoy usando Maven 2.2 + m2eclipse.


-1
2017-09-08 14:35