Generación de archivos WAR de una configuración de Maven multiproyecto
-
28-09-2019 - |
Pregunta
Tengo un proyecto Maven, con 4 componentes Web, Persistencia, comunes y otros.
El material relevante de mis archivos POM :
POM primaria:
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>
<modules>
<module>components/TestWeb</module>
<module>components/TestOther</module>
<module>components/TestPersistence</module>
<module>components/TestCommon</module>
</modules>
<build>
<defaultGoal>package</defaultGoal>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<configuration>
<dependentWarExcludes>
**/hibernate.cfg.xml,**/sql-map-config.xml,**/web.xml,WEB-INF/classes/META-INF/**
</dependentWarExcludes>
</configuration>
</plugin>
</plugins>
</build>
pom común:
<modelVersion>4.0.0</modelVersion>
<artifactId>test-common</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<relativePath>../../pom.xml</relativePath>
<version>0.0.1-SNAPSHOT</version>
</parent>
persistencia pom:
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test-persistence</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<relativePath>../../pom.xml</relativePath>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
pom web:
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>test-web</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>TestWeb</name>
<parent>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<relativePath>../../pom.xml</relativePath>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-persistence</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>test-other</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
Tal vez se rompió algo en el copiar y pegar, pero el XML es válido.
- cuando corro mvn package, no se crea el proyecto , pero todos los paquetes de componentes se crean y bien formados.
- Si, a continuación, corro
mvn war:war
, el archivo WAR se genera vacío.
¿Cómo se puede solucionar este problema?
Solución
Tener plugins en la raíz del proyecto no funciona. Puede configurar los plugins aquí, como este
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.2</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Pero todavía tienen que ser referenciado en los subproyectos para ser activo (a excepción de los plugins que son parte del proceso predeterminado, como maven-plugin y compilador-maven-recursos-plugin).
Así que, o mover su guerra-plugin de configuración para pluginManagement
en el proyecto de raíz e incluir
<build>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>2.1</version>
<execution>
<goals>...</goals>
</execution>
</plugin>
</build>
en su proyecto de guerra o se mueve toda la configuración en la guerra.
Nota adicional: Asegúrese de que el orden de los módulos en el pom raíz está alineado a las relaciones de dependencia entre los proyectos (En el caso que acabamos de invertir el orden).
Otros consejos
He creado una estructura de proyecto similar y pegado el POM se proporcionan, pero no se podía reproducir el problema. Correr mvn package
del pom agregación simplemente funciona como se espera:
$ mvn package [INFO] Scanning for projects... ... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] ------------------------------------------------------------------------ [INFO] Unnamed - com.test:test:pom:0.0.1-SNAPSHOT ............ SUCCESS [5.819s] [INFO] Unnamed - com.test:test-common:jar:0.0.1-SNAPSHOT ..... SUCCESS [3.343s] [INFO] Unnamed - com.test:test-persistence:jar:0.0.1-SNAPSHOT SUCCESS [0.136s] [INFO] Unnamed - com.test:test-other:jar:0.0.1-SNAPSHOT ...... SUCCESS [0.079s] [INFO] Unnamed - com.test:test-web:war:0.0.1-SNAPSHOT ........ SUCCESS [1.899s] [INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ ...
Y produce el siguiente resultado:
$ tree . . ├── components │ ├── TestCommon │ │ ├── pom.xml │ │ ├── ... │ │ └── target │ │ ├── maven-archiver │ │ │ └── pom.properties │ │ └── test-common-0.0.1-SNAPSHOT.jar │ ├── TestOther │ │ ├── pom.xml │ │ ├── ... │ │ └── target │ │ ├── maven-archiver │ │ │ └── pom.properties │ │ └── test-other-0.0.1-SNAPSHOT.jar │ ├── TestPersistence │ │ ├── pom.xml │ │ ├── ... │ │ └── target │ │ ├── maven-archiver │ │ │ └── pom.properties │ │ └── test-persistence-0.0.1-SNAPSHOT.jar │ └── TestWeb │ ├── pom.xml │ ├── src │ │ └── main │ │ └── webapp │ │ ├── index.jsp │ │ └── WEB-INF │ │ └── web.xml │ └── target │ ├── maven-archiver │ │ └── pom.properties │ ├── test-web-0.0.1-SNAPSHOT │ │ ├── index.jsp │ │ ├── META-INF │ │ └── WEB-INF │ │ ├── classes │ │ ├── lib │ │ │ ├── test-common-0.0.1-SNAPSHOT.jar │ │ │ ├── test-other-0.0.1-SNAPSHOT.jar │ │ │ └── test-persistence-0.0.1-SNAPSHOT.jar │ │ └── web.xml │ └── test-web-0.0.1-SNAPSHOT.war └── pom.xml
Así que el problema debe tener algo que ver con su proyecto de guerra misma, su estructura o algo así. Por favor, mostrar su estructura y la salida de Maven cuando se ejecuta war:war
en él.
Por cierto, aquí es cómo un POM debería ser normalmente como en una acumulación de múltiples módulos:
<project>
<modelVersion>4.0.0</modelVersion>
<!--groupId>com.test</groupId--> <!-- unnecessary, you inherit it -->
<artifactId>test-web</artifactId>
<packaging>war</packaging>
<!--version>0.0.1-SNAPSHOT</version--> <!-- unnecessary, you inherit it -->
<parent>
<groupId>com.test</groupId>
<artifactId>test</artifactId>
<relativePath>../../pom.xml</relativePath>
<version>0.0.1-SNAPSHOT</version>
</parent>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId> <!-- DRY, use built-in properties -->
<artifactId>test-common</artifactId>
<version>${project.version}</version> <!-- DRY, use built-in properties -->
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>test-persistence</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>test-other</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
Otra cosa, la guerra plugin de configuración del proyecto principal es heredada (se puede comprobar que mediante la ejecución de help:effective-pom
en el módulo web), sino que tendría sentido para configurarlo en el propio módulo web.