pom multi library example dependency create another maven multi-module

maven - library - spring boot multi module



Proyecto multi-módulo Maven-copiando todos los JARS "paquete" de los submódulos en el padre/destino/ (3)

He pasado todo el día tratando de resolver esto ... y finalmente funciona, así que aunque estoy en un horario difícil, lo compartiré aquí, si solo puedo salvar la frustración de alguien en el futuro ...

Paso 1 Cree un proyecto Maven adicional que sea el padre de todos los proyectos que quiera copiar juntos. Llamemos a este proyecto parent .

Este proyecto es necesario para decirle a Maven, que proyecta construir juntos. Además, declarará en sus otros proyectos que sus padres son parent , por lo que verán la propiedad MyDir que defina aquí.

<groupId>com.your.domain</groupId> <artifactId>parent</artifactId> <version>0.0.1</version> <packaging>pom</packaging> <properties> <MyDir>/your/path/to/copy/to</MyDir> </properties> <modules> <module>../project1</module> <module>../project2</module> <module>../project2</module> </modules>

Paso 2 Para cada proyecto que desee copiar en la misma ubicación, especifique que su padre es el proyecto parent (asegúrese de especificar groupId y artifactId correctos y la versión de su proyecto principal):

<parent> <groupId>com.your.domain</groupId> <artifactId>parent</artifactId> <version>0.0.1</version> <relativePath>../parent</relativePath> </parent>

Y también, para cada uno de estos proyectos, también especifique la configuración de los jar y los complementos de dependencia, así:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <outputDirectory>${MyDir}</outputDirectory> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.your.domain.Program</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <phase>install</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${MyDir}/lib</outputDirectory> </configuration> </execution> </executions> </plugin>

A continuación, ejecute mvn install en el proyecto principal. Bam!

PD Lo anterior asume que todos los proyectos están ubicados en el mismo directorio (proyecto principal al lado de los niños), pero puede cambiar las rutas relativas que desee.

Tengo un proyecto maven con bastantes submódulos. Lo que estoy buscando es una forma de obtener todos los archivos .jar producidos por los submódulos incluidos en el directorio POM''s / target / agregando, para que puedan ser usados ​​convenientemente después.

  • No necesitan fusionarse. Preferiblemente no, pero si deben ser, entonces eso está bien.
  • No me importan las dependencias
  • Esto es principalmente por conveniencia, en este momento

Una versión básica de lo que estoy buscando hacer:

Prj1/pom.xml => prj1/target/proj1.jar (and classes/generated-sources/etc) Prj2/pom.xml => prj2/target/proj2.jar Main/pom.xml => main/target/proj1.jar main/target/proj2.jar ... classes/generated-sources not needed at all, ... but they could be combined here. I assume they will be

He estado leyendo y usando algunas sugerencias de SO también. Hasta ahora no he encontrado una manera de hacer esto, pero estoy seguro de que está ahí.

editar:

He renunciado a hacer que esto funcione de una manera sencilla, para todos los subproyectos incluidos. La mejor respuesta que tengo hasta ahora es usar el complemento dependencia para especificar manualmente (nuevamente), todos y cada uno de los submódulos que se incluirán. La idea era poder configurar fácilmente los POM para las docenas de clientes, simplemente incluyendo los módulos necesarios y luego tenerlo mágicamente para pegar todos los frascos de los submódulos en un solo lugar. Maven es muy amable, cuando no haces mucho con eso, pero el impuesto de ángulos es increíble cuando lo intentas.

Todavía me resulta extraño que esas tareas que parecen estándar (a juzgar por las preguntas formuladas en SO, y lo que cualquier proyecto normal haría) son tan difíciles. ¿Es maven3 mejor?


Podrías probar el maven-dependency-plugin:copy plugin: goal.

Deberá agregar esto al pom de todos los submódulos que quiera copiar. EDITAR: O simplemente en el pom padre (ver comentarios).

<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-artifact</id> <phase>package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <version>${project.version}</version> <type>${project.packaging}</type> </artifactItem> </artifactItems> <outputDirectory>../Main/target/dependencies</outputDirectory> </configuration> </execution> </executions> </plugin> </plugins> </build>

Si coloca esto en el pom principal, tenga en cuenta que funcionará muy bien solo si su proyecto completo tiene un módulo de profundidad. Lo que significa que si los módulos bajo el módulo padre tienen sus propios submódulos, no terminarán en la carpeta deseada. La estructura de tu carpeta se verá así:

- Parent - Module 1 - Sub module 1 **Main** - Module 2 **Main**

Para evitar esto, cree un módulo dedicado con la configuración anterior y especifique manualmente cada módulo que desea copiar. De esta forma, todos los módulos, sin importar qué tan profundos sean, terminarán en una carpeta.


Una forma de lograr esto sería usar la opción moduleSet del complemento maven assembly .

Puede crear un descriptor de ensamblaje como este (una variación del ejemplo en el enlace) y usarlo en la declaración del plugin de ensamblaje en el pom.

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> <id>bin</id> <formats> <format>dir</format> </formats> <includeBaseDirectory>false</includeBaseDirectory> <moduleSets> <moduleSet> <useAllReactorProjects>true</useAllReactorProjects> <binaries> <outputDirectory>/</outputDirectory> <unpack>false</unpack> </binaries> </moduleSet> </moduleSets> </assembly>