tutorial sts que proyecto pom plugin español desde crear consola configurar comandos maven-2 directory module root

maven 2 - sts - Encontrar el directorio raíz de un proyecto de reactor maven de varios módulos



maven tutorial español pdf (10)

Quiero utilizar el complemento maven-dependency para copiar los archivos EAR de todos los submódulos de mi proyecto de varios módulos a un directorio que sea relativo al directorio raíz de todo el proyecto.

Es decir, mi diseño es similar a esto, los nombres han cambiado:

to-deploy/ my-project/ ear-module-a/ ear-module-b/ more-modules-1/ ear-module-c/ ear-module-d/ more-modules-2/ ear-module-e/ ear-module-f/ ...

Y quiero que todos los archivos EAR se copien de los directorios de destino de sus respectivos módulos en my-project/../to-deploy así que termino con

to-deploy/ ear-module-a.ear ear-module-b.ear ear-module-c.ear ear-module-d.ear ear-module-e.ear ear-module-f.ear my-project/ ...

Podría hacerlo con una ruta relativa en cada módulo auricular, así:

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>install</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>${project.groupId}</groupId> <artifactId>${project.artifactId}</artifactId> <version>${project.version}</version> <type>ear</type> <outputDirectory>../../to-deploy</outputDirectory> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>

Pero preferiría no especificar una ruta relativa en el elemento <outputDirectory> . Preferiría algo como ${reactor.root.directory}/../to-deploy , pero no puedo encontrar nada como esto.

Además, preferiría que hubiera alguna forma de heredar esta configuración de maven-dependency-plugin para que no tenga que especificarla para cada módulo EAR.

También traté de heredar una propiedad personalizada del root pom:

<properties> <myproject.root>${basedir}</myproject.root> </properties>

Pero cuando traté de usar ${myproject.root} en los POM del módulo ear, el ${basedir} se resolvería en la base del ear-module.

Además, encontré http://labs.consol.de/lang/de/blog/maven/project-root-path-in-a-maven-multi-module-project/ donde se sugiere que cada desarrollador y, presumiblemente, el continuo El servidor de integración debe configurar el directorio raíz en un archivo profiles.xml, pero no lo considero una solución.

Entonces, ¿hay una manera fácil de encontrar la raíz de un proyecto de varios módulos?


use ${session.executionRootDirectory}

Para el registro, ${session.executionRootDirectory} funciona para mí en archivos pom en Maven 3.0.3. Esa propiedad será el directorio en el que se está ejecutando, por lo tanto, ejecute el proyecto principal y cada módulo puede obtener la ruta a ese directorio raíz.

Puse la configuración del complemento que usa esta propiedad en el pom padre para que se herede. Lo uso en un perfil que solo selecciono cuando sé que voy a ejecutar Maven en el proyecto principal. De esta forma, es menos probable que use esta variable de una forma no deseada cuando ejecuto Maven en un proyecto secundario (porque entonces la variable no sería la ruta de acceso del padre).

Por ejemplo,

<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>${session.executionRootDirectory}/target/</outputDirectory> </configuration> </execution> </executions> </plugin>


Algo que he usado en mis proyectos es anular la propiedad en los poms del submódulo.

root: <myproject.root>${basedir}</myproject.root> moduleA: <myproject.root>${basedir}/..</myproject.root> other/moduleX: <myproject.root>${basedir}/../..</myproject.root>

De esta forma, aún tiene las rutas relativas, pero puede definir un complemento una vez en el módulo raíz, y sus módulos lo heredarán con la sustitución correcta para myproject.root.


Como otros han sugerido, directory-maven-plugin es el camino a seguir. Sin embargo, encontré que funciona mejor con el objetivo ''directorio-de'', como se describe aquí: https://.com/a/37965143/6498617 .

Prefiero que usar el más alto-basedir no funcionó para mí con un proyecto de varios módulos, con poms de varios módulos anidados. El objetivo del directorio le permite establecer una propiedad para la ruta de cualquier módulo en todo el proyecto, incluida la raíz del curso. También es mucho mejor que $ {session.executionRootDirectory}, porque siempre funciona, independientemente de si se crea el root o un submódulo, e independientemente del directorio de trabajo actual donde se mvn.


Desde Maven 3.3.1, puede usar ${maven.multiModuleProjectDirectory} para este propósito. (gracias a https://.com/a/48879554/302789 )

editar: parece que solo funciona correctamente cuando tienes una carpeta .mvn en la raíz de tu proyecto.


El siguiente pequeño perfil funcionó para mí. Necesitaba tal configuración para CheckStyle, que puse en el directorio config en la raíz del proyecto, para poder ejecutarlo desde el módulo principal y desde los submódulos.

<profile> <id>root-dir</id> <activation> <file> <exists>${project.basedir}/../../config/checkstyle.xml</exists> </file> </activation> <properties> <project.config.path>${project.basedir}/../config</project.config.path> </properties> </profile>

No funcionará para módulos anidados, pero estoy seguro de que se puede modificar para eso usando varios perfiles con diferentes exists . (No tengo idea de por qué debería haber "../ .." en la etiqueta de verificación y solo ".." en la propiedad sobrescrita, pero funciona solo de esa manera).


Hay un plugin maven que resuelve este problema en particular: directory-maven-plugin

Asignará la ruta raíz de su proyecto a la propiedad que elija. Ver el objetivo highest-basedir en los documentos.

Por ejemplo:

<!-- Directory plugin to find parent root directory absolute path --> <plugin> <groupId>org.commonjava.maven.plugins</groupId> <artifactId>directory-maven-plugin</artifactId> <version>0.1</version> <executions> <execution> <id>directories</id> <goals> <goal>highest-basedir</goal> </goals> <phase>initialize</phase> <configuration> <property>main.basedir</property> </configuration> </execution> </executions> </plugin>

Luego use ${main.basedir} en cualquier lugar de su pom.xml padre / hijo.


Me encontré con un problema similar ya que necesitaba copiar archivos entre proyectos. Lo que hace Maven es lógico porque mantendrá el pom.xml instalado en el repositorio lejos del valor codificado.

Mi solución fue poner un directorio copiado en un artefacto Maven, luego emplear Ant para extraer / copiar


No conozco una "buena" manera de encontrar la raíz de un proyecto de varios módulos. Pero quizás puedas mejorar un poco tu enfoque actual.

Una primera alternativa sería crear un módulo adicional directamente bajo el proyecto raíz, declarar todos los EAR como dependencias y usar la dependency:copy-dependencies para copiar las dependencias del módulo al directorio to-deploy (relativamente). Sí, la ruta seguiría siendo relativa, pero dado que la configuración del complemento de dependencia estaría centralizada, no creo que sea tan molesto.

Una segunda alternativa sería usar el Complemento de ensamblaje de Maven en lugar del Complemento de dependencia de Maven para crear una distribución con el formato de dir (esto creará una distribución en un directorio). Esto es realmente lo que haría.


Otra solución sería usar una tarea ant para escribir "rootdir = $ {basedir}" en un target / root.properties en el proyecto raíz, y luego usar el complemento de propiedades para volver a leer ese archivo. No lo he probado yo mismo, pero supongo que debería funcionar ...?


de modo que: en algún lugar de las propiedades de algún proyecto principal, tengo el archivo con el que necesito relacionarme más adelante, por eso necesito una ruta absoluta en todos lados. Entonces, lo entiendo con la ayuda de Groovy :

<properties> <source> import java.io.File; String p =project.properties[''env-properties-file'']; File f = new File(p); if (!f.exists()) { f = new File("../" + p); if (!f.exists()) { f = new File("../../" + p); } } // setting path together with file name in variable xyz_format project.properties[''xyz_format''] =f.getAbsolutePath() + File.separator + "abc_format.xml"; </source> </properties>

y entonces:

<properties> <snapshots>http://localhost:8081/snapshots<snapshots> <releases>http://localhost:8081/releases</releases> <sonar>jdbc:oracle:thin:sonar/sonar@localhost/XE</sonar> <sonar.jdbc.username>sonar</sonar.jdbc.username> <format.conf> ${xyz_format}</format.conf> <---- here is it! </properties>

¡funciona!