Use a versão mais recente de uma dependência no Maven
1. Visão geral
Atualizar as dependências do Maven manualmente sempre foi um trabalho tedioso, especialmente em projetos com muitas bibliotecas sendo liberadas com freqüência.
Neste tutorial, aprenderemoshow to exploit the Versions Maven Plugin to keep our dependencies up-to-date.
Acima de tudo, isso pode ser extremamente útil na implementação de pipelines de Integração Contínua que atualizam automaticamente as dependências, testam se tudo ainda funciona corretamente e confirmam ou revertem o resultado, o que for apropriado.
2. Sintaxe do intervalo de versões do Maven
Na época do Maven2, os desenvolvedores podiam especificar intervalos de versão dentro dos quais os artefatos seriam atualizados sem a necessidade de intervenção manual.
Essa sintaxe ainda é válida, usada em vários projetos por aí e, portanto, vale a pena conhecer:
No entanto, devemos evitá-lo a favor do Versions Maven Plugin sempre que possível, porque o avanço de versões concretas do lado de fora nos dá definitivamente mais controle do que permitir que o Maven lide com toda a operação por conta própria.
2.1. Sintaxe Descontinuada
Maven2 também forneceu dois valores de metaversão especiais para atingir o resultado:LATESTeRELEASE.
However, this legacy upgrade method was causing unpredictability where CI needed reproducibility. Portanto,they’ve been deprecated and completely removed em Maven3:
Para criar reproduções reproduzíveis, o Maven 3.x não oferece mais suporte ao uso dessas metaversões no POM
3. Versões do plugin Maven
OVersions Maven Plugin é a maneira padrão de fato de lidar com o gerenciamento de versões atualmente.
Desde comparações de alto nível entre repositórios remotos até bloqueio de timestamp de baixo nível para versões do SNAPSHOT, sua enorme lista de objetivos nos permite cuidar de todos os aspectos de nossos projetos que envolvem dependências.
Embora muitos deles estejam fora do escopo deste tutorial, vamos dar uma olhada em alguns que nos ajudarão no processo de atualização.
3.1. O Caso de Teste
Antes de começar, vamos definir nosso caso de teste:
-
três LANÇAMENTOS com uma versão codificada
-
um RELEASE com uma versão de propriedade e
-
um INSTANTÂNEO
commons-io
commons-io
2.3
org.apache.commons
commons-collections4
4.0
org.apache.commons
commons-lang3
3.0
org.apache.commons
commons-compress
${commons-compress-version}
commons-beanutils
commons-beanutils
1.9.1-SNAPSHOT
1.15
Finalmente, vamos também excluir um artefato do processo ao definir o plug-in:
org.codehaus.mojo
versions-maven-plugin
2.7
org.apache.commons:commons-collections4
4. Exibindo atualizações disponíveis
Em primeiro lugar,to simply know if and how we can update our project, the right tool for the job is versions:display-dependency-updates:
mvn versions:display-dependency-updates
Como podemos ver,the process included every RELEASE version. It even included commons-collections4 since the exclusion in the configuration refers to the update process, and not to the discovery one.
Em contraste, ele ignorou o SNAPSHOT, pelo motivo de que é uma versão de desenvolvimento que muitas vezes não é segura para atualizar automaticamente.
5. Atualizando as dependências
Ao executar uma atualização pela primeira vez, o plugin cria um backup depom.xml denominadopom.xml.versionsBackup.
Embora cada iteração altere opom.xml, o arquivo de backup preservará o estado original do projeto até o momento em que o usuário confirmar (por meio demvn versions:commit) ou reverter (por meio demvn versions:revert) o todo o processo.
5.1. Convertendo SNAPSHOTs em RELEASEs
Às vezes acontece que um projeto inclui um INSTANTÂNEO (uma versão que ainda está em desenvolvimento pesado).
Podemos usarversions:use-releases para verificar se o RELEASE correspondente foi publicado, e ainda mais para converter nosso SNAPSHOT naquele RELEASE ao mesmo tempo:
mvn versions:use-releases
5.2. Atualizando para o próximo RELEASE
We can port every non-SNAPSHOT dependency to its nearest version comversions:use-next-releases:
mvn versions:use-next-releases
Podemos ver claramente que o plugin atualizoucommons-io,commons-lang3, e atécommons-beanutils, que não é mais um SNAPSHOT, para sua próxima versão.
Mais importante ainda, ele ignoroucommons-collections4, que é excluído da configuração do plugin, ecommons-compress, que tem um número de versão especificado dinamicamente por meio de uma propriedade.
5.3. Atualizando para o último RELEASE
Atualizar cada dependência não-SNAPSHOT para sua versão mais recente funciona da mesma maneira, simplesmente alterando o objetivo paraversions:use-latest-releases:
mvn versions:use-latest-releases
6. Filtrando versões indesejadas
In case we want to ignore certain versions, the plugin configuration can be tuned para carregar regras dinamicamente de um arquivo externo:
org.codehaus.mojo
versions-maven-plugin
2.7
http://www.mycompany.com/maven-version-rules.xml
Mais digno de nota,<rulesUri> também pode se referir a um arquivo local:
file:///home/andrea/maven-version-rules.xml
6.1. Ignorando versões globalmente
Podemos configurar nosso arquivo de regras para queit’ll ignore versions matching a specific Regular Expression:
.*-beta
6.2. Ignorando versões com base na regra
Finalmente, caso nossas necessidades sejam mais específicas, podemos criar um conjunto de regras:
.*-RELEASE
2.1.0
7. Conclusão
Vimos como verificar e atualizar as dependências de um projeto de maneira segura, automática e compatível com Maven3.
Como sempre, o código-fonte está disponívelover on GitHub, junto com um script para ajudar a mostrar tudo passo a passo e sem complexidade.
Para vê-lo em ação, basta baixar o projeto e executar em um terminal (ou no Git Bash se estiver usando o Windows):
./run-the-demo.sh