Atualizando o número da versão dos módulos em um projeto Maven com vários módulos


325

Eu tenho um projeto multi-módulo maven. Pretendemos versão todos esses módulos juntos. Mas, a partir de agora, estou terminando a versão codificada em cada módulo pom.xml, como abaixo

<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>

e o módulo pai principal tem a configuração abaixo

<modelVersion>4.0.0</modelVersion>
<groupId>com.xyz</groupId>
<artifactId>xyz-application</artifactId>
<version>2.50.0.g</version>
<packaging>pom</packaging>

1
Sua pergunta está incorreta e confunde as pessoas que possuem POMs verdadeiros de vários módulos ("agregados"). Do seu exemplo e das respostas, parece que você está realmente falando sobre um POM pai, não um POM agregado de vários módulos. Consulte maven.apache.org/pom.html#Aggregation .
Garret Wilson

Respostas:


631

Use versions:setno plug-in version-maven :

mvn versions:set -DnewVersion=2.50.1-SNAPSHOT

Ele ajustará todas as versões pom, versões pai e versões de dependência em um projeto de vários módulos.

Se você cometeu um erro, faça

mvn versions:revert

depois, ou

mvn versions:commit

se você está feliz com os resultados.


Nota: esta solução assume que todos os módulos também usam o pom agregado como pom pai, um cenário que foi considerado padrão no momento desta resposta. Se não for esse o caso, procure a resposta de Garret Wilson .


5
Seria ótimo se houvesse uma solução que não exija que você realmente altere cada módulo. A única alternativa em que consigo pensar é sempre usar uma versão instantânea para o pom-pai.
AmanicA

54
Além do que versions:setse pode especificar -DgenerateBackupPoms=false, como padrão, este plugin faz backup de arquivos pom originais.
Maksim Sorokin

20
Esse é o ponto do versions:commit: "Remove o backup inicial do pom, aceitando as alterações".
22814 Michael Laffargue

2
Uma nova resolve plugins a questão descritas nesta questão de forma diferente: mojo.codehaus.org/flatten-maven-plugin/examples/...
Stephan

1
@MichaelLaffargue versões MVn: cometem parece para remover os arquivos de backup gerados do pom.xml anterior
Cris Rockwell

58

A resposta fornecida assume que o projeto em questão usa a herança do projeto além da agregação do módulo. De fato, esses são conceitos distintos:

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

Alguns projetos podem ser uma agregação de módulos, mas ainda não possuem um relacionamento pai-filho entre o POM do agregador e os módulos agregados. (Pode não haver uma relação pai-filho, ou os módulos filhos podem usar um POM separado como o "pai".) Nessas situações, a resposta fornecida não funcionará.

Após muita leitura e experimentação, verifica-se que há uma maneira de usar o plug - in do Maven para atualizar não apenas o POM agregador, mas também todos os módulos agregados; é a processAllModulesopção O seguinte comando deve ser executado no diretório do projeto agregador:

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

O Versions Maven Plugin não apenas atualiza as versões de todos os módulos contidos, como também atualiza as dependências entre módulos !!!! Esta é uma vitória enorme e economizará muito tempo e evitará todo tipo de problemas.

Obviamente, não esqueça de confirmar as alterações em todos os módulos, o que você também pode fazer com o mesmo switch:

mvn versions:commit -DprocessAllModules

Você pode decidir dispensar completamente o POMS de backup e fazer tudo em um comando:

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

Como automatizamos a próxima versão, assim como o plug-in auxiliar de construção?
Lostintranslation

Usando o Maven 3.5.0, não consigo fazer isso funcionar. Eu tenho agregação de projeto e apenas o pai pom foi atualizado. Eu também tentei a herança do projeto (junto com a agregação - "todas as três regras" do link fornecido) e, novamente, apenas o pom pai foi atualizado.
SiKing 17/05/19

1
Encontrou o interruptor secreto de fazer funcionar: a versão inicial do pom principal e dos módulos deve ser a mesma! Meu pai pai estava começando com "1-SNAPSHOT" e os módulos tinham "1.0.0-SNAPSHOT". :)
SiKing 17/05/19

1
Com um projeto agregador, a versão do agregador e as versões dos submódulos não precisam ser iguais. (Por exemplo, seu pom agregador pode mudar apenas raramente e pode permanecer em uma versão específica, enquanto os submódulos individuais podem ter seus próprios ciclos de lançamento). A propriedade chave a ser especificada para o versions:setplug-in é que -DoldVersion='*', em mojohaus.org/versions-maven-plugin/set-mojo.html , diz explicitamente que essa propriedade deve ser especificada ao processar um projeto agregador.
Matthew Wise

2
Sob quais condições -DprocessAllModulesrealmente funciona? Isso não funciona para mim.
Alex R

24

Se você deseja automatizar totalmente o processo (ou seja, você deseja aumentar o número da versão sem precisar saber qual é o número da versão atual), faça o seguinte:

mvn build-helper:parse-version versions:set -DnewVersion=\${parsedVersion.majorVersion}.\${parsedVersion.minorVersion}.\${parsedVersion.nextIncrementalVersion} versions:commit

3
Obrigado, @Crummy, você salvou meu dia
Maksim Kostromin


Ou você pode usar-DoldVersion='*'
Matthew Wise

23

Você pode consultar o objetivo do release: plugin -update-release do Maven . Ele atualizará a versão dos pais, bem como todos os módulos sob ela.


Atualização: Observe que o acima é o plugin de lançamento. Se você não estiver liberando, convém usarversions:set

mvn versions:set -DnewVersion=1.2.3-SNAPSHOT

1
Versão mvn: set não afeta os módulos.
precisa saber é o seguinte


OK, acontece quando a construção do reator é ao mesmo tempo pai. É confuso quando a estrutura parece o contrário ...
9ilsdx 9rvj 0lo

mvn release:update-versions -DautoVersionSubmodulesfuncionou bem para mim, mesmo que eu não esteja liberando :-)
msa 2/03

11

Convido você a ler o Maven Book sobre construções de múltiplos módulos (reatores).

Eu quis dizer em particular o seguinte:

<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>

deve ser alterado para. Aqui, tome cuidado com a versão não definida apenas na parte pai 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 é um link melhor .


10
e procurar o que especificamente?
Thorbjørn Ravn Andersen

2
+1 por exibir a formatação correta dos pom.xmlarquivos, mas eu concordo (com @ ThorbjørnRavnAndersen) que ler um livro inteiro para essas informações é um exagero. : p
Priidu Neemre

7
Infelizmente, herdar informações da versão do pai não remove o ônus de ter que modificar todos os arquivos pom no projeto - porque todos fazem referência ao pai pelo número da versão .
Steven the Facilly divertido

1
Você pode usar versões-maven-plugin que lida com tudo isso ou você pode usar o maven-release-plugin e assim você não precisa lidar com isso manualmente ...
khmarbaise

5

versions:update-child-modulessoa como o que você está procurando. Você pode fazer as versões: defina como mencionado, mas esta é uma maneira leve de atualizar os números de versão pai. Para os módulos filhos, é minha opinião que você remova as <version>definições, pois elas herdarão o número da versão do módulo pai.


3

A melhor maneira é que, como você pretende agrupar seus módulos, é possível especificar a <dependencyManagement>tag na parte externa mais externa pom.xml(módulo pai) diretamente na <project>tag. Controla a versão e o nome do grupo. No seu módulo individual, você só precisa especificar a <artifactId>tag no seu pom.xml. Vai levar a versão do arquivo pai.


Não consigo encontrar a tag dependencyManagement no pom.xml . Você está pensando em outra coisa ?
ArturoTena

0

a maneira mais fácil é mudar a versão em cada pom.xml para versão arbitrária. verifique se o gerenciamento de dependências usa a versão correta do módulo usado neste módulo! por exemplo, se você deseja aumentar o controle de versão para um projeto de módulo de reboque, deve fazer o seguinte:

no módulo childe:

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

e no módulo pai:

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

0

Para atualizar a versão principal do pom.xml e pai nos submódulos:

mvn versions:set -DnewVersion=1.3.0-SNAPSHOT -N versions:update-child-modules -DgenerateBackupPoms=false
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.