2009-12-18 20 views
9

Aquí está mi variación de los "múltiples artefactos de Maven build" pregunta: ¿proyecto Maven (EJB) con artefactos de cliente y servidor

Estoy portar de Ant para Maven. Mi aplicación es un servidor EJB que está empaquetado como un EAR, pero también expone un JAR de cliente para que lo usen otras aplicaciones cliente. Este jar contiene las interfaces EJB, clase de fachada y algunos ayudantes.

Sé que la forma de Maven es tener un artefacto por proyecto (POM); sin embargo, ambos artefactos (EAR del servidor y JAR del cliente) deben construirse desde el mismo árbol fuente: el servidor y el recurso compartido del cliente, por ejemplo, las interfaces EJB e 'inicio'.

¿Cómo puedo hacer esto en Maven?

¿Tengo un proyecto que contenga dos POM, por ejemplo server-pom.xml & client-pom.xml? Pensaba que también podría tener un padre POM (pom.xml) que se pueda usar para construir el cliente y el servidor de una sola vez. Sin embargo, los ciclos de vida divergen después de la fase de 'paquete', ya que el servidor debe pasar por el ensamblado (tar/gzip), mientras que el cliente finaliza después de 'paquete' y puede simplemente instalarse en el repositorio.

¿Algún consejo/experiencia sobre la mejor manera de abordar esto?

Respuesta

18

sé que el camino es tener Maven un artefacto por proyecto (POM); sin embargo, ambos artefactos (EAR del servidor y JAR del cliente) deben construirse desde el mismo árbol fuente: el servidor y el recurso compartido del cliente, por ejemplo, las interfaces EJB e 'inicio'.

Existen algunas excepciones a la regla "un artefacto por proyecto", siendo los proyectos EJB uno de ellos. Por lo tanto, la maven-ejb-plugin puede ser configurado para generar el tarro de EJB y un JAR de cliente de esta manera:

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-ejb-plugin</artifactId> 
     <configuration> 
      <generateClient>true</generateClient> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

Para utilizar el cliente EJB en otro proyecto, simplemente añadirlo como la dependencia de <type>ejb-client</type>:

<project> 
    [...] 
    <dependencies> 
    <dependency> 
     <groupId>com.example</groupId> 
     <artifactId>ejb-project</artifactId> 
     <version>1.0-SNAPSHOT</version> 
     <type>ejb-client</type> 
    </dependency> 
    </dependencies> 
    [...] 
</project> 

Consulte Generating an EJB client, Using the ejb-client as a dependency y la documentación de ejb mojo para obtener más información (incluida la forma de personalizar las clases incluidas/excluidas del cliente ejb).

+0

¡Excelente! Déjame intentar eso. –

+1

@Pascal, esto funciona bien excepto cuando el cliente EJB es una dependencia de otro módulo dentro del mismo proyecto de varios módulos. En primer lugar, no puede usar el cliente EJB como un módulo anidado en la lista de módulos de los padres, ya que no tiene su propia carpeta, es solo un subproducto del módulo EJB. En segundo lugar, el artefacto del cliente EJB solo se crea en la fase del paquete, por lo que el reactor no podría agregarlo al classpath combinado de todos modos. –

+1

Parece que tengo que abandonar este enfoque y crear un módulo explícito para el cliente EJB. Sin embargo, esto significa que este nuevo módulo 'ejb-client' tendría que compartir el origen de Java con el módulo principal 'ejb' (las interfaces EJB son compartidas). Supongo que mantendré la fuente en el módulo principal 'ejb' y configuraré el módulo 'ejb-client' para que apunte a la misma carpeta de origen (por ejemplo, ../ejb/src). –

6

He usado multimodule projects para resolver esto antes.

project/ 
    pom.xml <- type=pom, lists sub modules 
    ejb/ 
     src/main/java, etc. 
     pom.xml <- type=ejb, describes ejb module, has dependency on "jar" module 
    jar/ 
     src/main/java, etc. 
     pom.xml <- type=jar, simple, builds jar 
    ear/ 
     pom.xml <- type=ear, has reference to ejb module that it should use 
    ... 

He uso de este enfoque para los proyectos más complejos que pueden tener una docena de módulos diferentes que deben ser construidos juntos. Consulte el ear docs para hacer referencia al ejb.

El pom.xml matriz que utilice los modules etiqueta:

<modules> 
    <module>jar</module> 
    <module>ejb</module> 
    <module>ear</module> 
</modules> 

Y el uso de la pom.xml niño parent la etiqueta:

<parent> 
    <groupid>mygroup</group> 
    <artifactId>parentName</artifactId> 
</parent> 
+0

@John, estoy de acuerdo con el enfoque de varios módulos.Sin embargo, no estoy seguro de entender el uso del paquete EAR para el * cliente *: el jar * client * no debe estar dentro del EAR, y también debe construirse desde la misma base de código (src/main/java)) como el código EAR, ya que ambos artefactos comparten la interfaz EJB/clases de origen. –

Cuestiones relacionadas