Hospedagem Profissional

Hospedagem Profissional
Clique aqui e ganhe US$ 10,00 para testar durante 1 mês a melhor hospedagem: Digital Ocean!

quarta-feira, 30 de outubro de 2013

Melhores formas de atualizar números de versão de módulos de um projeto Maven

A divisão de um projeto Maven em módulos é considerada uma boa prática e é muito utilizada no mercado em geral.

Segundo a documentação oficial (Maven by Example - Chapter 6. A Multi-module Project), é indicado que a versão seja definida somente no projeto Pai (parent) e que os módulos do projeto herdem a versão, dessa forma facilitando e centralizando o processo de alteração da versão.

No projeto "parent":

 <project xmlns="http://maven.apache.org/POM/4.0.0"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
                http://maven.apache.org/maven-v4_0_0.xsd">  
   <modelVersion>4.0.0</modelVersion>  
   <groupId>org.sonatype.mavenbook.optimize</groupId>  
   <artifactId>simple-parent</artifactId>  
   <packaging>pom</packaging>  
   <version>1.0</version>  
   <name>Chapter 8 Simple Parent Project</name>  
   <modules>  
     <module>simple-command</module>  
     <module>simple-model</module>  
     <module>simple-weather</module>  
     <module>simple-persist</module>  
     <module>simple-webapp</module>  
   </modules>  
   ...  
 </project>  

E no módulo :

 <project xmlns="http://maven.apache.org/POM/4.0.0"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0  
                http://maven.apache.org/maven-v4_0_0.xsd">  
   <modelVersion>4.0.0</modelVersion>  
   <parent>  
     <groupId>org.sonatype.mavenbook.optimize</groupId>  
     <artifactId>simple-parent</artifactId>  
     <version>1.0</version>  
   </parent>  
   <artifactId>simple-command</artifactId>  
   <packaging>jar</packaging>  
   <name>Chapter 8 Simple Command Line Tool</name>  
   ...  
 </project>  

Perceba que não existe definição de versão para o módulo em si e sim uma referência à qual versão do "parent" este módulo deve herdar.

Mesmo utilizando essa estratégia, nos momentos em que é necessário gerar uma nova versão o processo de atualização da mesma nos arquivos pom.xml dos módulos se torna uma tarefa desagradável e passível de erro. Uma alternativa para facilitar a vida é utilizar o plugin Versions-Maven, mais especificamente o "goal" versions:set.

Por exemplo:

 mvn versions:set -DnewVersion=2.0  

O comando acima irá atualizar a versão do "parent" e as referências à essa versão em todos os módulos do projeto de 1.0 para 2.0

Se por um acaso desejar reverter as alterações realizadas, o comando a seguir pode ser executado:

 mvn versions:revert  

Caso tudo esteja de acordo, as alterações podem ser confirmadas :

 mvn versions:commit  

Em tempo: Por padrão, esse plugin realiza um backup das versões anteriores dos arquivos pom.xml.
Se você estiver seguro o bastante,  você pode desativar esta opção utilizando o parâmetro -DgenerateBackupPoms=false

Para a documentação detalhada, acesse  o link http://mojo.codehaus.org/versions-maven-plugin/set-mojo.html

Não deixe de dar uma olhada também no "goal" versions:update-child-modules :

"versions:update-child-modules: updates the parent section of the child modules of a project so the version matches the version of the current project. For example, if you have an aggregator pom that is also the parent for the projects that it aggregates and the children and parent versions get out of sync, this mojo can help fix the versions of the child modules. (Note you may need to invoke Maven with the -N option in order to run this goal if your project is broken so badly that it cannot build because of the version mis-match)."

Em um próximo post falarei sobre o plugin Maven Release Plugin, o qual possui um "goal" com função semelhante, o release:update-versions, porém agrega uma série de outras atividades auxiliares no processo de release de uma versão de um projeto Maven.