migrar - maven-antrun-plugin example
Ant a Maven: múltiples objetivos de compilación (3)
Tienes 2 opciones:
Si el subconjunto es solo una colección de recursos, entonces 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 un module .
Si el subconjunto se vuelve a empacar en varios "sabores" diferentes, entonces definiría los ensamblajes para cada "sabor" y calificaría los nombres de los artefactos con un "clasificador" para ver las coordenadas de maven .
Finalmente, puede 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.
Tengo una compilación Ant que actualmente se está convirtiendo en 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.
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 formas de manejar esto?
Tu primer pensamiento es el correcto. Divida las 2 piezas en 2 proyectos.
La filosofía de maven es que cada proyecto debe construir uno y solo artefacto (jar, war, whatever)
Probablemente puedas hackear algo juntos para que solo tengas un proyecto maven construyendo 2 atrifacts, pero sería un hack.
Puedes llamar a hormiga 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 "maven-antrun-plugin"
Podrías hacer esto con perfiles ...
Si realmente quería usar dos perfiles separados y personalizar el plugin JAR para incluir y excluir patrones de nombres de clases y paquetes, podría hacer esto fácilmente colocando 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 eso parece una gran cantidad de configuración, el soporte de Polyglot Maven para Groovy POM está casi listo. Reducirá considerablemente la cuenta de la línea.
Pondrá esto al final de su pom.xml (dentro del elemento del proyecto) y agregará 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
Probé esto en comparación con la aplicación de muestra que viene con el Capítulo 6 de Maven por ejemplo , y al ejecutar cualquiera de estos comandos se generará un archivo JAR en $ {basedir} / target que tiene 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, podrías hacer esto con dos ejecuciones de plugins JAR ...
Si necesita crear dos JAR sin usar 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 de 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 no está hablando de incluir un conjunto diferente de clases en cada artefacto, querrá usar Maven Assemblies. 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 la documentación del Plugin Maven Assembly . En el menú de navegación de la izquierda, verá una lista de descriptores de ensamblaje de muestra.
Descargo de responsabilidad: (Por favor) no hagas 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.
Si bien puede hacer esto con 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 haga 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. Los Capítulos 3-5 se enfocan en proyectos de un solo módulo, y el Capítulo 6 muestra cómo combinaría estos componentes de un solo módulo en un proyecto de múltiples módulos más grande.
Para más información:
Su pregunta involucra los siguientes temas, aquí hay algunos enlaces que proporcionarán más detalles para cada uno:
El plugin Maven JAR: http://maven.apache.org/plugins/maven-jar-plugin/jar-mojo.html
Proyectos Maven de varios módulos: Capítulo 6 de Maven por Ejemplo y Sección 3.6.2 de Maven: La referencia completa .
Maven Lifecycle (jar está obligado a empaquetar si su paquete es "jar"): Sección 3.5.2 de Maven por ejemplo "Core Concepts" y Capítulo 4 de Maven: The Complete Reference
Ensamblajes de Maven: Primero, el sitio del complemento Maven Assembly , luego el Capítulo 8 de Maven: The Complete Reference para algunos detalles pesados (casi demasiado pesados).