2011-10-25 15 views
9

Pregunta similar here.¿Cómo ensamblar el proyecto maven multimodular en un WAR?

Me gustaría obtener UN WAR resultante para ser desplegado desde 3 módulos maven diferentes. Los módulos de guerra son absolutamente no-conflicto:

  • primero que tiene clases de Java y algunas WEB-INF/artefactos

  • segundo son sólo API - Interfaces - que debe ser o bien ya presente en el contenedor o parte de la guerra resultante (que es lo que quiero)

  • tercera con clases de implementación, WEB-INF/artefactos (infraestructura de la primavera, web.xml, etc)

La primera depende de las interfaces y la implementación. El tercero depende de las interfaces.

Tengo un lío total en las posibles opciones.

¿Utilizo Superposiciones para esto?

¿O utilizo el complemento de ensamblaje para poder integrar las clases de la segunda?

¿Utilizo Cargo plugin?

¿O lo logra maven-war-plugin si especifico webResources de un módulo diferente? Porque this dude está haciendo casi lo mismo que yo, pero con 2 módulos de guerra solamente, y él no usa el plugin de ensamblaje, ni superposiciones ....

Por favor dime, ¿cómo se hace esto correctamente?

Respuesta

7

Esto solo requiere un poco de uso avanzado de maven jar & war plugin.

primero que tiene clases de Java y algunas WEB-INF/artefactos

Digamos que esto representa la principal guerra. Solo usas la característica Overlays de maven-war-plugin. La forma más básica consiste en especificar la dependencia guerra:

<dependency> 
     <groupId>${groupId}</groupId> 
     <artifactId>${rootArtifactId}-service-impl</artifactId> 
     <version>${version}</version> 
     <type>war</type> 
     <scope>runtime</scope> 
    </dependency> 

y di plugin de guerra experto para fusionar los activos de esta dependencia en la guerra principal (donde estamos ahora)

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration> 
     <dependentWarExcludes>WEB-INF/web.xml,**/**.class</dependentWarExcludes> 
     <webResources> 
      <resource> 
       <!-- change if necessary --> 
       <directory>src/main/webapp/WEB-INF</directory> 
       <filtering>true</filtering> 
       <targetPath>WEB-INF</targetPath> 
      </resource> 
     </webResources> 
    </configuration> 
</plugin> 

También incluyen un frasco tipo de dependencia en el segundo (que será un JAR en WEB-INF/lib/)

<dependency> 
     <groupId>${groupId}</groupId> 
     <artifactId>${rootArtifactId}-service</artifactId> 
     <version>${version}</version> 
     <type>jar</type> 
    </dependency> 

Y también hay que especificar la dependencia de las clases de la tercera guerra:

<dependency> 
     <groupId>${groupId}</groupId> 
     <artifactId>${rootArtifactId}-service-impl</artifactId> 
     <version>${version}</version> 
     <classifier>classes</classifier> 
     <type>jar</type> 
    </dependency> 

Aviso del clasificador, es necesario porque está especificando 2 dependencias del mismo artefacto ...Para que funcione, tiene que configurar el plugin frasco en el tercer artefacto (guerra tipo de artefacto), en relación con el clasificador y el hecho de que necesita 2 paquetes desde uno artefactos (guerra & frasco):

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <!-- jar goal must be attached to package phase because this artifact is WAR and we need additional package --> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      <configuration> 
      <!-- 
       classifier must be specified because we specify 2 artifactId dependencies in Portlet module, they differ in type jar/war, but maven requires classifier in this case 
      --> 
       <classifier>classes</classifier> 
       <includes> 
        <include>**/**.class</include> 
       </includes> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
+0

Gracias, muy útil. Al principio no me di cuenta de que el plugin jar en realidad tiene que ser utilizado en el archivo pom del tercer proyecto. Después de incluirlo, todo funcionó a la perfección. – AndreiM

Cuestiones relacionadas