Actualización de números de versión de módulos en un proyecto Maven de módulos múltiples

325

Tengo un proyecto maven multimódulo. Tenemos la intención de versionar todos estos módulos juntos. Pero a partir de ahora estoy terminando la versión de codificación dura en cada uno de los módulos pom.xml como se muestra a continuación

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

y el módulo principal principal tiene la siguiente configuración

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>
sandeepkunkunuru
fuente
1
Su pregunta está mal expresada y confunde a las personas que tienen verdaderos POM de varios módulos ("agregados"). De su ejemplo y de las respuestas parece que realmente está hablando de un POM principal, no de un POM agregado de varios módulos. Ver maven.apache.org/pom.html#Aggregation .
Garret Wilson

Respuestas:

631

Uso versions:setdel complemento de versiones-maven :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Ajustará todas las versiones de pom, versiones primarias y versiones de dependencia en un proyecto de varios módulos.

Si cometiste un error, haz

mvn versions:revert

luego, o

mvn versions:commit

Si estás contento con los resultados.


Nota: esta solución asume que todos los módulos usan el pom agregado como pom padre también, un escenario que se consideraba estándar en el momento de esta respuesta. Si ese no es el caso, busque la respuesta de Garret Wilson .

Sean Patrick Floyd
fuente
55
Hubiera sido genial si hubiera una solución que no requiera que realmente cambie cada módulo. La única alternativa que se me ocurre es usar siempre una versión de instantánea para el padre-pom.
AmanicA
54
Además, versions:setse puede especificar -DgenerateBackupPoms=false, ya que, de forma predeterminada, este complemento realiza una copia de seguridad de los archivos pom originales.
Maksim Sorokin
20
Ese es el punto de versions:commit: "Elimina la copia de seguridad inicial del pom, aceptando así los cambios".
Michael Laffargue
2
Un nuevo complemento resuelve el problema descrito en esta pregunta de manera diferente: mojo.codehaus.org/flatten-maven-plugin/examples/…
Stephan
1
@MichaelLaffargue versiones mvn: commit parece eliminar los archivos de copia de seguridad generados en el pom.xml anterior
Cris Rockwell
58

La respuesta dada supone que el proyecto en cuestión usa la herencia del proyecto además de la agregación del módulo. De hecho, esos son conceptos distintos:

https://maven.apache.org/guides/introduction/introduction-to-the-pom.html#Project_Inheritance_vs_Project_Aggregation

Algunos proyectos pueden ser una agregación de módulos, pero no tienen una relación padre-hijo entre el agregador POM y los módulos agregados. (Es posible que no haya una relación padre-hijo en absoluto, o los módulos hijos pueden usar un POM separado como "padre"). En estas situaciones, la respuesta dada no funcionará.

Después de mucha lectura y experimentación, resulta que hay una manera de usar el complemento Versions Maven para actualizar no solo el agregador POM sino también todos los módulos agregados; Es la processAllModulesopción. El siguiente comando debe hacerse en el directorio del proyecto agregador:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules

¡El complemento Versions Maven no solo actualizará las versiones de todos los módulos contenidos, sino que también actualizará las dependencias entre módulos! Esta es una gran victoria y ahorrará mucho tiempo y evitará todo tipo de problemas.

Por supuesto, no olvide confirmar los cambios en todos los módulos, lo que también puede hacer con el mismo interruptor:

mvn versions:commit -DprocessAllModules

Puede decidir prescindir del POMS de respaldo por completo y hacer todo en un solo comando:

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT -DprocessAllModules -DgenerateBackupPoms=false
Garret Wilson
fuente
¿Cómo automatizamos la próxima versión al igual que el complemento build-helper?
lostintranslation
Usando Maven 3.5.0 no puedo hacer que esto funcione. Tengo agregación de proyectos y solo se actualizó el pom padre. También probé la herencia del proyecto (junto con la agregación: "las tres reglas" desde el enlace proporcionado), y nuevamente solo se actualizó el pom padre.
SiKing
1
Encontré el interruptor secreto de hacer que funcione: ¡la versión inicial del pom padre y los módulos tiene que ser la misma! Mi padre pom estaba empezando con "1-SNAPSHOT" y los módulos tenían "1.0.0-SNAPSHOT". :)
SiKing
1
Con un proyecto de agregador, la versión del agregador y las versiones de los submódulos no tienen que ser las mismas. (Por ejemplo, su pom agregador solo puede cambiar raramente y puede permanecer en una versión en particular, mientras que los submódulos individuales pueden tener sus propios ciclos de lanzamiento). La propiedad clave para especificar el versions:setcomplemento es -DoldVersion='*', en mojohaus.org/versions-maven-plugin/set-mojo.html , dice explícitamente que esta propiedad debe especificarse al procesar un proyecto de agregación.
Matthew Wise
2
¿En qué condiciones funciona -DprocessAllModulesrealmente? A mi no me funciona.
Alex R
24

Si desea automatizar completamente el proceso (es decir, desea incrementar el número de versión sin tener que saber cuál es el número de versión actual), puede hacer esto:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit
Malcolm Crum
fuente
3
Gracias, @Crummy, me has salvado el día
Maksim Kostromin
O puede usar-DoldVersion='*'
Matthew Wise
23

Es posible que desee ver el lanzamiento del complemento de lanzamiento de Maven : objetivo de actualización de versiones . Actualizará la versión del padre, así como todos los módulos que se encuentran debajo.


Actualización: Tenga en cuenta que lo anterior es el complemento de lanzamiento. Si no está lanzando, es posible que desee utilizarversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT
Nishant
fuente
1
Versión de mvn: set no afecta a los módulos.
9ilsdx 9rvj 0lo
OK, lo hace cuando la construcción del reactor es al mismo tiempo padre. Es confuso cuando la estructura se ve de otra manera ...
9ilsdx 9rvj 0lo
mvn release:update-versions -DautoVersionSubmodulesfuncionó bien para mí, incluso si no estoy lanzando :-)
msa
11

Te animo a leer el libro de Maven sobre construcciones de módulos múltiples (reactores).

Me refería en particular a lo siguiente:

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>
<version>2.50.0.g</version>

debe cambiarse a Aquí tenga cuidado con la versión no definida solo en la parte principal que está definida.

<modelVersion>4.0.0</modelVersion>

<parent>
    <artifactId>xyz-application</artifactId>
    <groupId>com.xyz</groupId>
    <version>2.50.0.g</version>
</parent>
<groupId>com.xyz</groupId>
<artifactId>xyz-Library</artifactId>

Este es un mejor enlace .

khmarbaise
fuente
10
y buscar qué específicamente?
Thorbjørn Ravn Andersen
2
+1 por mostrar el formato adecuado para los pom.xmlarchivos, pero estoy de acuerdo (con @ ThorbjørnRavnAndersen) en que leer un libro completo para obtener esta información es excesivo. : p
Priidu Neemre
77
Desafortunadamente, heredar la información de versión del padre no elimina la carga de tener que modificar todos los archivos pom en el proyecto, porque todos hacen referencia al padre por número de versión .
Steven el fácilmente divertido
1
Podrías usar versiones-maven-plugin que maneja todo esto o puedes usar maven-release-plugin y así no necesitas manejar esto manualmente ...
khmarbaise
5

versions:update-child-modulessuena como lo que estás buscando. Puede hacer versiones: configure como se mencionó, pero esta es una forma ligera de actualizar los números de versión principal. Para los módulos secundarios, es mi opinión que debe eliminar las <version>definiciones, ya que heredarán el número de versión del módulo principal.

Jon Onstott
fuente
3

La mejor manera es que, dado que tiene la intención de agrupar sus módulos, puede especificar la <dependencyManagement>etiqueta en la parte más externa pom.xml(módulo principal) directamente debajo de la <project>etiqueta. Controla la versión y el nombre del grupo. En su módulo individual, solo necesita especificar la <artifactId>etiqueta en su pom.xml. Tomará la versión del archivo principal.

murali
fuente
No puedo encontrar la etiqueta dependencyManagement en pom.xml . ¿Estás pensando en otra cosa ?
ArturoTena
0

la forma más fácil es cambiar la versión en cada pom.xml a una versión arbitraria. ¡luego verifique que la administración de dependencias use la versión correcta del módulo usado en este módulo! por ejemplo, si desea aumentar el control de versiones para un proyecto de módulo de remolque, debe hacer como fluir:

en el módulo childe:

    <parent>
       <artifactId>A-application</artifactId>
       <groupId>com.A</groupId>
       <version>new-version</version>
    </parent>

y en el módulo padre:

<groupId>com.A</groupId>
<artifactId>A-application</artifactId>
<version>new-version</version>
Mojtaba Mirakbari
fuente
0

Para actualizar pom.xml principal y la versión principal en submódulos:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
angel.lopezrial
fuente