2010-01-25 30 views
50

Tengo una compilación Ant que actualmente se está convirtiendo a Maven. Sin embargo, la compilación Ant tiene 2 objetivos de compilación, uno que construye la aplicación completa y otro que crea un JAR a partir de algunos de esos archivos (solo unos pocos). En Ant, es fácil tener varios objetivos de compilación para manejar esto, pero estoy tratando de determinar la mejor manera de manejar esto en Maven.Ant a Maven - múltiples objetivos de compilación

Podría dividir el subconjunto de archivos en un segundo proyecto y tendrá su propio POM. Entonces el primer proyecto podría depender de este. Sin embargo, dado que el subconjunto de archivos es muy pequeño (menos de 10), parece que puede ser excesivo tener un proyecto completamente nuevo para eso.

¿Hay otras maneras de manejar esto?

Respuesta

22

Su primera idea es la correcta. Divida las 2 piezas en 2 proyectos.

La filosofía experto es que cada proyecto debe construir uno y único artefacto (frasco, guerra, lo que sea)

Probablemente se podría hackear algo juntos de manera que sólo tiene un maven construcción del proyecto 2 atrifacts, pero sería un truco.

Puedes llamar a horm desde maven, así que si realmente quieres hacer esto, entonces te sugiero que comiences a buscar el plugin maven ant. La Identificación del artefacto es "experto-antRun-plugin"

5

Tienes 2 opciones:

Si el subconjunto es sólo una colección de recursos, a continuación, No lo convertiría en un módulo separado.

Si el proyecto siempre depende del subconjunto que se empaqueta de manera uniforme, entonces el subconjunto es un buen candidato para convertirse en module.

Si el subconjunto se vuelve a empaquetar en varios "sabores" diferentes, entonces definiría ensamblajes para cada "sabor" y calificaría los nombres de artefacto con un "clasificador", véase maven coordinates.

Finalmente, podría usar perfiles para determinar qué ensamblajes se producen, su perfil predeterminado solo puede crear el "sabor" de artefacto inicial que se requiere durante el desarrollo.
Un perfil "completo" puede producir todas las variantes de "sabor" del artefacto para el despliegue final una vez que se completa el desarrollo.

+1

+1 gracias, escuché por primera vez sobre ensambles – stacker

+1

He utilizado ensamblajes para empaquetar el artefacto que construí junto con dependencias, scripts, etc. ¿Es común usar los ensamblajes para construir un subconjunto de archivos? ¿O es una mejor práctica dividir el subconjunto de archivos en su propio proyecto? –

66

Usted puede hacer esto con perfiles ...

Si realmente quería utilizar dos perfiles distintos y personalizar el plugin JAR para incluir y excluir los patrones de nombres de clases y paquetes, fácilmente se podría hacer esto poner algo como esto en su POM:

<profiles> 
    <profile> 
    <id>everything</id> 
    <build> 
     <plugins> 
     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
      <classifier>everything</classifier> 
      <includes> 
       <include>**/*</include> 
      </includes> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 
    </profile> 
    <profile> 
    <id>only-library</id> 
    <build> 
     <plugins> 
     <plugin> 
      <artifactId>maven-jar-plugin</artifactId> 
      <configuration> 
      <classifier>only-library</classifier> 
      <excludes> 
       <exclude>**/Main*</exclude> 
      </excludes> 
      </configuration> 
     </plugin> 
     </plugins> 
    </build> 
    </profile> 
</profiles> 

Aparte: Si esto parece como un montón de configuración, soporte políglota de Maven para los POM maravilloso está casi listo. Reducirá considerablemente la cuenta de la línea.

Lo pondría al final de su pom.xml (dentro del elemento del proyecto), y agrega dos perfiles. El primer perfil "todo" está realmente allí para demostrar la configuración. Este perfil de "todo" es innecesario porque simplemente duplica el comportamiento de la ejecución del objetivo jar del complemento JAR predeterminado. El segundo perfil "only-library" excluye cualquier clase en cualquier paquete que comience con el texto "Main". Para invocar estos perfiles:

mvn package -Peverything 
mvn package -Ponly-library 

He probado esto en contra de la aplicación de ejemplo que se incluye con Chapter 6 of Maven by Example, y corriendo uno de estos comandos producirá un archivo JAR en $ {} basedir/destino que tenga un clasificador. Dado que el objetivo jar del complemento JAR está vinculado a la fase del paquete en el ciclo de vida maven predeterminado, estos dos perfiles modificarán la configuración de este complemento.

O bien, puede hacer esto con las ejecuciones de plugins dos JAR ...

Si necesita crear dos archivos JAR sin utilizar perfiles. Puede vincular el objetivo jar del complemento JAR a la fase del ciclo de vida del paquete varias veces y utilizar una configuración diferente para cada ejecución configurada. Si configura dos ejecuciones separadas, cada ejecución tiene un bloque de configuración específico de la ejecución para que pueda suministrar un identificador único y un patrón de inclusión/exclusión para cada ejecución.

Aquí está el elemento de compilación que usaría para agregar ambos JAR personalizados al "paquete" de la fase del ciclo de vida. Hacer esto en un proyecto con "jar" de embalaje daría lugar a que el objetivo jar se ejecutara tres veces. Una vez como el enlace de ciclo de vida predeterminado, y luego dos veces para dos JAR clasificados y personalizados.

<build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
      <execution> 
      <id>only-library</id> 
      <goals><goal>jar</goal></goals> 
      <phase>package</phase> 
      <configuration> 
       <classifier>only-library</classifier> 
       <excludes> 
       <exclude>**/Main*</exclude> 
       </excludes> 
      </configuration> 
      </execution> 
      <execution> 
      <id>everything</id> 
      <goals><goal>jar</goal></goals> 
      <phase>package</phase> 
      <configuration> 
       <classifier>everything</classifier> 
       <includes> 
       <include>**/*</include> 
       </includes> 
      </configuration> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 

Si usted no está hablando acerca de la inclusión de un conjunto diferente de clases en cada artefacto, tendrá que utilizar Asambleas Maven. Si desea conocer los detalles de las asambleas, hay un capítulo enumerado al final de esta respuesta de Maven: The Complete Reference. Francamente, no creo que este capítulo en particular sea una buena referencia introductoria; de hecho, he recibido numerosos informes de que este capítulo es prácticamente ilegible (y estamos trabajando para solucionarlo). Si está buscando utilizar ensamblajes, le recomiendo el Maven Assembly Plugin's documentation. En el menú de navegación de la izquierda, verá una lista de descriptores de ensamblaje de muestra.

Descargo de responsabilidad: (Por favor) no haga esto. Si está creando dos JAR de diferencia con dos conjuntos de clases diferentes, le recomiendo que divida el proyecto en dos módulos interdependientes.

Mientras puede hacer esto con los perfiles, le resultará más fácil dividir el proyecto en dos (en realidad tres). A más largo plazo, habrá retos a los que se enfrentará a medida que su aplicación se amplíe. Usted será responsable de averiguar esta lista manual de clases y paquetes que se incluirán en cada uno de sus JAR clasificados.

Hay una sobrecarga mínima para tener un proyecto principal simple que hace referencia a dos módulos separados. Si nos fijamos en el libro gratuito Maven por ejemplo, mostramos cómo hacer la transición entre un proyecto de módulo único y uno de varios módulos. Chapters 3-5 se enfoca en proyectos de un solo módulo, y Chapter 6 le muestra cómo combinaría estos componentes de módulo individual en un proyecto de varios módulos más grande.

Para más información:

Usted pregunta involucra los siguientes temas, aquí hay algunos enlaces que proporcionarán más detalles para cada uno:

El JAR plugin Maven: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html

multi-módulo Proyectos Maven: Chapter 6 of Maven by Example y Section 3.6.2 of Maven: The Complete Reference.

El ciclo de vida de Maven (frasco está obligado a empaquetar si su packagin es "jar"): Section 3.5.2 of Maven by Example "Core Concepts" y Chapter 4 of Maven: The Complete Reference

Asambleas Maven: En primer lugar, la Maven Assembly Plugin site, entonces Chapter 8 of Maven: The Complete Reference por algunos detalles pesados ​​(casi demasiado pesados).

+4

Guau, buena respuesta Tom. Big +1. –

+0

Gracias por la respuesta detallada. Me gustaría evitar el uso de patrones de paquetes. Parece un dolor de cabeza de mantenimiento si entran otros desarrolladores y no necesariamente conocen los patrones que deben usarse. –

Cuestiones relacionadas