maven-2 - dependency - maven multi module example
Variable Maven para raĆz de reactor (7)
¿Hay alguna variable que siempre apunte al directorio raíz (aquel desde el cual se ejecutó el comando maven)?
user.dir
(el directorio de trabajo) debe ser ese directorio.
En un proyecto maven de varios módulos, ¿hay alguna variable que apunte a la carpeta del proyecto raíz?
-
${project.basedir}
apunta al directorio del proyecto actual, -
${project.parent.basedir}
apunta al directorio del proyecto principal,
pero ¿hay alguna variable que siempre apunte al directorio raíz (aquel desde el cual se ejecutó el comando maven), sin importar de qué proyecto se encuentre dentro del reactor?
Me di cuenta de que el problema que quería resolver es bastante insoluble. Quería una variable que apuntara a project.basedir, project.parent.basedir, project.parent.parent.basedir, etc., la que sea mayor. Pero como el pom padre de un proyecto no necesita ser su padre en el sistema de archivos, mi enfoque completo no ayudará. Así que estoy aceptando la respuesta de Pascal porque responde mi pregunta (incluso si mi pregunta no resuelve mi problema).
Dicha propiedad se puede crear usando: directory-maven-plugin . Utilizando el objetivo highest-basedir
el complemento, puede asignar la ruta raíz a cualquier propiedad que especifique.
En Maven 3, ${session.executionRootDirectory}
es "una variable que siempre apunta al ... directorio ... desde el que se ejecutó el comando maven".
Tenga en cuenta que esto es distinto de una propiedad que proporciona el directorio raíz de nivel superior de un proyecto de varios módulos, independientemente de dónde se ejecute en la estructura de directorio mvn
. Tal propiedad no existe, que yo sepa, pero puede usar el ${basedir}/..
para lograrlo. Vea este hilo en maven-users para más detalles.
Ver también: Encontrar el directorio raíz de un proyecto de reactor maven de múltiples módulos
En el último maven, puedes usar $ {maven.multiModuleProjectDirectory}.
Hasta donde yo creo, no hay tal variable. Solo hay una solución alternativa en la respuesta aceptada de la propiedad Maven2 que indica el directorio padre .
Para mí, había una necesidad de directorio raíz durante la interpolación variable , no para la sección de complementos, para el directorio local relativo a la raíz con frascos hechos a mano. Sé que esta es una mala práctica tener un directorio local con frascos, pero este era un requisito del proyecto.
Por qué no pude usar diferentes soluciones:
-
${session.executionRootDirectory}
y${user.dir}
están vinculados con el directorio desde el que se ejecutó el comando maven. Quiero referirme al mismo directorio independientemente del directorio desde el que se lanzó maven. -
${project.basedir}
, como se mencionó anteriormente, apunta al directorio del proyecto actual, por lo que los módulos secundarios buscarán tarros en la ubicación incorrecta. - Tenía alrededor de 100 proyectos, por lo que la definición de rutas relativas o el uso de la respuesta aceptada para esta pregunta es bastante complejo en mi caso.
- directory-maven-plugin se puede usar para configuraciones de complementos, no para la interpolación de variables
Por lo tanto, en mi caso con los malos requisitos, he utilizado la variable de entorno que refiere al proyecto root y lo usé en pom.xml. Úselo como último recurso, cuando otras soluciones no funcionan. Aquí hay un ejemplo de cómo uso la variable de entorno en mi caso:
<repositories>
<repository>
<id>local-maven-repo</id>
<!--NOTE: export PROJECT_ROOT=<location>-->
<url>file:///${env.PROJECT_ROOT}/local-repo</url>
</repository>
</repositories>
Use directory-maven-plugin con el objetivo directory-of .
A diferencia de otras sugerencias:
- Esta solución funciona para proyectos de múltiples módulos.
- Funciona ya sea que construyas el proyecto completo o un submódulo
- Funciona ya sea que ejecute maven desde la carpeta raíz o un submódulo (a diferencia de $ {session.executionRootDirectory}
- ¡No es necesario establecer una propiedad de ruta relativa en todos y cada uno de los submódulos!
El complemento le permite establecer una propiedad de su elección en la ruta absoluta de cualquiera de los módulos del proyecto. En mi caso, lo configuré para el módulo raíz ... En mi proyecto root pom:
<plugin>
<groupId>org.commonjava.maven.plugins</groupId>
<artifactId>directory-maven-plugin</artifactId>
<version>0.1</version>
<executions>
<execution>
<id>directories</id>
<goals>
<goal>directory-of</goal>
</goals>
<phase>initialize</phase>
<configuration>
<property>myproject.basedir</property>
<project>
<groupId>com.my.domain</groupId>
<artifactId>my-root-artifact</artifactId>
</project>
</configuration>
</execution>
</executions>
</plugin>
Desde ese momento, $ {myproject.basedir} en cualquier submódulo pom siempre tiene la ruta del módulo raíz del proyecto. Y, por supuesto, puede establecer la propiedad en cualquier módulo, no solo en la raíz ...