Em projetos Maven, é possível passar dinamicamente números de versão durante o build usando parâmetros JVM (-D), combinados com propriedades Maven (<properties>) ou filtragem de recursos (Resource Filtering). Veja abaixo as abordagens disponíveis:
1. Abordagem: Sobrescrita de Propriedades via -D
O Maven permite que parâmetros -D sobrescrevam propriedades definidas no pom.xml, incluindo a versão do projeto.
Procedimento
(1) Definir propriedade de versão no pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.exemplo</groupId>
<artifactId>meu-projeto</artifactId>
<!-- Definição da propriedade de versão (valor padrão) -->
<properties>
<versao.app>1.0.0-SNAPSHOT</versao.app>
</properties>
<!-- Utilização da propriedade de versão -->
<version>${versao.app}</version>
<!-- Demais configurações... -->
</project>
(2) Passar versão via -D
No momento do build, sobrescreva versao.app:
mvn clean install -Dversao.app=2.0.0-RELEASE
- O Maven utilizará
2.0.0-RELEASEem vez do valor padrão1.0.0-SNAPSHOTdefinido nopom.xml.
Quando utilizar
- Pipelines CI/CD: passagem dinâmica de versões (exemplo:
1.0.0-${BUILD_NUMBER}). - Depuração local: troca rápida de versões para testes.
2. Abordagem: Uso do flatten-maven-plugin (Recomendado)
Para gravar a versão dinâmica no pom.xml final (por exemplo, para publicação em repositórios Nexus), utilize o flatten-maven-plugin para substituir variáveis durante o build.
Procedimento
(1) Configurar o flatten-maven-plugin
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
<flattenMode>resolveCiFriendliesOnly</flattenMode>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
(2) Utilizar ${revisao} para definir a versão
<properties>
<revisao>1.0.0-SNAPSHOT</revisao>
</properties>
<version>${revisao}</version>
(3) Passar versão via -D
mvn clean install -Drevisao=2.0.0-RELEASE
- O plugin substitui
${revisao}por2.0.0-RELEASEe gera um arquivopom.xml.flatten(altera opom.xmloriginal seupdatePomFile=true).
Vantagens
- O POM gerado contém a versão real, adequado para publicação em repositórios.
- Suporta versões dinâmicas em CI/CD (exemplo:
1.0.0-${HASH_COMMIT_GIT}).
3. Abordagem: versions-maven-plugin para Alterações em Lote
Para modificar a versão antes do build (não dinamicamente), utilize o versions-maven-plugin.
Procedimento
(1) Configurar o plugin
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.16.0</version>
</plugin>
(2) Especificar nova versão via -D
mvn versions:set -DnewVersion=2.0.0-RELEASE
- Este comando modifica todos os arquivos
pom.xmldos módulos, exigindo commmit no Git.
Quando utilizar
- Upgrade manual da versão do projeto (sem passagem dinâmica).
4. Abordagem: Filtragem de Recursos para Arquivos de Configuração
Para gravar a versão em arquivos de configuração da aplicação (como application.properties), combine resource filtering com o parâmetro -D.
Procedimento
(1) Ativar filtragem de recursos no pom.xml
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
(2) Referenciar propriedade de versão no arquivo de configuração
src/main/resources/application.properties:
app.version=${project.version}
(3) Passar versão via -D
mvn clean package -Dversao.app=2.0.0-RELEASE
- Após o build,
${project.version}emapplication.propertiesserá substituído por2.0.0-RELEASE.
Observação
- Este método afeta apenas arquivos de recursos, não modifica o
<version>nopom.xml.
5. Herança de Versão entre Módulos
Utilize <parent> + variáveis (recomendado) No POM pai, defina a versão como variável; módulos filhos referenciam via ${project.parent.version}.
Procedimento
- POM pai (
pom.xml):
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.exemplo</groupId>
<artifactId>projeto-pai</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<versao.principal>1.0.0</versao.principal>
</properties>
</project>
- Módulo filho (
modulo-filho/pom.xml):
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.exemplo</groupId>
<artifactId>projeto-pai</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>modulo-filho</artifactId>
<!-- Forma 1: omitir <version> (requer Maven 3.5.0+) -->
<!-- Forma 2: referenciar versão do pai explicitamente -->
<version>${project.parent.version}</version>
<!-- Ou usar variável definida no POM pai -->
<version>${versao.principal}</version>
</project>
Vantagens
- Versão centralizada no POM pai.
- Módulos filhos não precisam repetir a definição (Maven 3.5.0+ permite omitir
<version>).
Atenção
Se omitir <version> no módulo filho, certifique-se de que a <version> do POM pai seja fixa (não pode ser variável como ${revisao}).
6. Exemplo Completo
Configuração do pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.exemplo</groupId>
<artifactId>meu-projeto</artifactId>
<properties>
<versao.app>1.0.0-SNAPSHOT</versao.app>
</properties>
<version>${versao.app}</version>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.6.0</version>
<configuration>
<updatePomFile>true</updatePomFile>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Comando de Build
mvn clean install -Dversao.app=2.0.0-RELEASE
Tabela Resumo
| Abordagem | Cenário de Uso | Modifica pom.xml |
Suporte CI/CD |
|---|---|---|---|
-D para sobrescrever propriedades |
Versões dinâmicas simples | Não (sobrescrita em tempo de execução) | Sim |
flatten-maven-plugin |
Publicação em repositório | Sim (gera POM achatado) | Sim |
versions-maven-plugin |
Upgrade em lote | Sim (modifica arquivos) | Não (requer commit Git) |
| Filtragem de recursos | Gravar em arquivos de configuração | Não (apenas recursos) | Sim |
| Herança pai/filho | Não | Sim (é possível alterar versão do POM pai em tempo de execução) |
Sugestões de Uso
- Versões dinâmicas em CI/CD: utilize
flatten-maven-plugin+-Drevisao. - Depuração local: simplesmante sobrescreva via
-Dversao.app. - Upgrade em lote: empregue o
versions-maven-plugin.