estoy mirando a la reestructuración de un gran proyecto de Maven ...consejos Maven en relación con el control de versiones de un gran proyecto y la evitación de las versiones que contienen expresiones
Una descripción básica de nuestra estructura actual:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-beta12-SNAPSHOT
server-utils:6.0.0.0-beta12-SNAPSHOT
...
CMW Root:6.0.0.0-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-beta12-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-beta12-SNAPSHOT
...
la razón para el cambio:
el tamaño de cada módulo colectivo (es decir, NRW Utilidades, CMW Root y NRW Root) es grande y la buil d El proceso comienza a tomar una cantidad de tiempo insoportable (~ 4 horas a veces).
El nuevo plan:
build [MVN plugins, third party dependency management]:5.1
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
Hemos empezado a introducir 'llaves' en la versión para distinguir entre diferentes módulos 'colectivos' y por lo tanto se pueden realizar fácilmente las liberaciones escalonadas. Además, nuestros módulos de utilidad son mucho más estables, por lo que es posible que no necesitemos casi tantas versiones beta: ahora no hay restricciones para mantener sincronizados los números beta.
También vale la pena señalar que de hecho hay 5 diferentes 'módulos colectivos' (no solo 3) todos para ser construidos con diferentes versiones (distinguidas por claves únicas) por lo que pensé que sería bueno tener un lugar centralizado para las versiones, en oposición a las propiedades duplicadas en 5 diferentes POM.
El problema ahora radica en los contenidos de los archivos POM cuando se definen las dependencias de módulos en un 'módulo colectivo' diferente de una versión diferente.
La solución propuesta a la dependencia de gestión de versiones:
build [MVN plugins, third party dependency management]:5.1
nrw-version-management:6.0.0.0-beta-SNAPSHOT
[contains properties defining latest versions of each collective module]
NRW Utils:6.0.0.0-NU-beta4-SNAPSHOT
server-utils:6.0.0.0-NU-beta4-SNAPSHOT
...
CMW Root:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-webapp:6.0.0.0-CMW-beta12-SNAPSHOT
cmw-core [dependencies on NRW Utils]:6.0.0.0-CMW-beta12-SNAPSHOT
...
NRW Root :6.0.0.0-NRW-beta9-SNAPSHOT
nrw-webapp [depends on NRW Utils & CMW Root modules]:6.0.0.0-NRW-beta9-SNAPSHOT
...
NRW-versión-gestión (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>build</artifactId>
<version>5.1</version>
</parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>6.0.0.0-beta-SNAPSHOT</version>
<name>Version Maven Properties</name>
<description>A centralised place for all module property versions</description>
<packaging>pom</packaging>
<properties>
<nrw.utilities.version>6.0.0.0-NU-beta4-SNAPSHOT</nrw.utilities.version>
<nrw.cmw.version>6.0.0.0-CMW-beta12-SNAPSHOT</nrw.cmw.version>
<nrw.version>6.0.0.0-NRW-beta9-SNAPSHOT</nrw.version>
</properties>
...
CMW Root (pom.xml):
...
<parent>
<groupId>com.project</groupId>
<artifactId>nrw-versions-manager</artifactId>
<version>${nrw.core.version}</version>
...
</parent>
<groupId>com.project</groupId>
<artifactId>CMW-root</artifactId>
<version>6.0.0.0-CMW-beta12-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
...
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>server-utils</artifactId>
<version>${nrw.utilities.version}</version>
</dependency>
...
</dependencyManagement>
<profiles>
<profile>
<id>all</id>
<modules>
<module>cmw-webapp</module>
<module>cmw-core</module>
...
</modules>
</profile>
...
</profiles>
...
N.B. la propiedad $ {nrw.core.version} se establecería en 6.3.0.0-beta-SNAPSHOT para una compilación de instantánea a través de argumentos de línea de comando (o un valor de propiedad predeterminado).
Un posible proceso de liberación (por 6.0.0.0):
- construir el módulo 5.1 build si no está ya construida
- Construir NRW-versión-gestión 6.0.0.0 (para evitar dependencias de instantáneas - Sin embargo no hay propiedades se cambian aún)
- Build NRW Utilidades 6.0.0.0-NU args cmd: -Dnrw.core.version = 6.0.0.0
- Construir CMW Root 6.0.0.0-CMW args cmd: -Dnrw. core.versi on = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU
- Build NRW Root 6.0.0.0-NRW cmd args: -Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0 .0.0-NU -Dnrw.cmw.version = 6.0.0.0-CMW
- Reformado NRW-versión-gestión 6.0.0.0 para el repositorio de args cmd: -Dnrw.core.version = 6.0.0.0 -Dnrw.utilities.version = 6.0.0.0-NU -Dnrw.cmw. versión = 6.0.0.0-CMW -NRW-gestión de versiones
- Build 6.1.0.0-beta-INSTANTÁNEA con nuevas versiones dev y archivo de actualización POM
El problema:
El proceso de construcción parece prolijo, especialmente relacionado con el módulo nrw-version-management. Además, empecé a ver esta advertencia:
'versión' contiene una expresión, pero debe ser una constante
y habiendo hecho algunas investigaciones ahora entiendo no se recomiendan las expresiones al configurar versiones (cuando se especifica un POM padre):
- Warning on using project.parent.version as the version of a module in Maven 3
- Maven: property substitution not done for /project/version tag of pom?
- http://maven.40175.n5.nabble.com/Pom-Parent-Version-Properties-td124576.html
Las preguntas:
- ¿Puedo simplemente ignorar esta advertencia? Algunas publicaciones están comenzando a sugerir que podría ser aceptable especificar versiones principales de POM usando propiedades.
- ¿Este enfoque general es convencional? ¿O defectuoso?
- ¿Existen mejores soluciones para abordar la reestructuración de este proyecto en crecimiento?
Gracias de antemano.
Gracias por su aportación. La razón por la que nos desviamos de una única versión es que sin esa restricción será mucho más fácil dividir nuestra compilación en fragmentos 'bitesize', con la ventaja añadida de la simplicidad; ahora no necesitamos construir todo de nuevo si un módulo tiene una actualización. ¿Hay más pensamientos/formas de hacerlo con una sola versión? Gracias. –
Obtienes los trozos pequeños compartiendo un repositorio para tus artefactos. Hay que admitir que tienes que construir todo el proyecto cuando actualizas el número de versión, pero después de eso solo creas y despliegas los módulos donde ha habido algún desarrollo./oskar – lambda64
Hmmm - pero ya estamos usando un repositorio para artefactos construidos.Y dejar la compilación en una sola versión significa que tenemos que construir el proyecto como uno solo, lo que nos deja con el proceso de compilación (4 horas). Además, nuestros números de versión cambian con frecuencia (cuando solo ciertos módulos causan eso). –