No Maven, as dependências geralmente são configuradas assim:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Agora, se você estiver trabalhando com bibliotecas que possuem lançamentos frequentes, a atualização constante da tag <versão> pode ser um pouco irritante. Existe alguma maneira de dizer ao Maven para sempre usar a versão mais recente disponível (no repositório)?
java
maven
dependencies
maven-2
maven-metadata
Anders Sandvig
fonte
fonte
Respostas:
NOTA:
Esta resposta se aplica apenas ao Maven 2! As mencionadas
LATEST
eRELEASE
metaversões foram descartadas no Maven 3 "por uma questão de construções reproduzíveis" , há mais de 6 anos. Consulte esta solução compatível com Maven 3 .Se você sempre deseja usar a versão mais recente, o Maven possui duas palavras-chave que podem ser usadas como alternativa aos intervalos de versão. Você deve usar essas opções com cuidado, pois não está mais no controle dos plugins / dependências que está usando.
Consulte a seção POM Syntax do livro Maven para obter mais detalhes. Ou consulte este documento em intervalos de versão de dependência , onde:
[
&]
) significa "fechado" (inclusive).(
&)
) significa "aberto" (exclusivo).Aqui está um exemplo que ilustra as várias opções. No repositório do Maven, com.foo:my-foo possui os seguintes metadados:
Se for necessária uma dependência desse artefato, você terá as seguintes opções ( é claro que outros intervalos de versão podem ser especificados, apenas mostrando os relevantes aqui):
Declare uma versão exata (sempre será resolvida para 1.0.1):
Declare uma versão explícita (sempre resolverá a 1.0.1, a menos que ocorra uma colisão, quando o Maven selecionar uma versão correspondente):
Declare um intervalo de versão para todos os 1.x (atualmente resolverá para 1.1.1):
Declare um intervalo de versão em aberto (será resolvido para 2.0.0):
Declare a versão como ÚLTIMA (será resolvida para 2.0.0) (removida do maven 3.x)
Declare a versão como RELEASE (será resolvida para 1.1.1) (removida do maven 3.x):
Observe que, por padrão, suas próprias implantações atualizarão a entrada "mais recente" nos metadados do Maven, mas para atualizar a entrada "release", é necessário ativar o "perfil de liberação" do super POM do Maven . Você pode fazer isso com "-Prelease-profile" ou "-DperformRelease = true"
Vale ressaltar que qualquer abordagem que permita ao Maven escolher as versões de dependência (LATEST, RELEASE e intervalos de versão) pode deixá-lo aberto para criar problemas de tempo, pois versões posteriores podem ter um comportamento diferente (por exemplo, o plug-in de dependência alterou anteriormente o padrão valor de verdadeiro a falso, com resultados confusos).
Portanto, geralmente é uma boa ideia definir versões exatas nos lançamentos. Como a resposta de Tim aponta, o maven-version-plugin é uma ferramenta útil para atualizar as versões de dependência, particularmente as versões: use-latest-versions e versions: use-latest-releases goals.
fonte
[1.1,2.0)
Agora eu sei que esse tópico é antigo, mas lendo a pergunta e a resposta fornecida pelo OP, parece que o Maven Versions Plugin pode ter sido realmente uma resposta melhor para sua pergunta:
Em particular, os seguintes objetivos podem ser úteis:
Os outros objetivos a seguir também são fornecidos:
Apenas pensei em incluí-lo para qualquer referência futura.
fonte
Por favor, dê uma olhada nesta página (seção "Intervalos de versão de dependência"). O que você pode querer fazer é algo como
Esses intervalos de versão são implementados no Maven2.
fonte
mvn dependency:tree -Dverbose
descobrir isso. Isso poderia explicar a versão inesperada.Ao contrário de outros, acho que há muitas razões pelas quais você pode sempre querer a versão mais recente. Especialmente se você estiver fazendo uma implantação contínua (às vezes temos 5 lançamentos em um dia) e não quiser fazer um projeto com vários módulos.
O que faço é fazer com que o Hudson / Jenkins faça o seguinte para cada build:
Ou seja, eu uso o plug-in de versões e o plug-in scm para atualizar as dependências e depois faço check-in no controle de origem. Sim, deixei meus CI fazerem check-ins de SCM (o que você precisa fazer de qualquer maneira para o plugin maven release).
Você desejará configurar o plug-in de versões para atualizar apenas o que deseja:
Eu uso o plug-in de liberação para fazer a liberação que cuida de -SNAPSHOT e valida a existência de uma versão do -SNAPSHOT (que é importante).
Se você fizer o que eu faço, obterá a versão mais recente para todas as compilações de snapshots e a versão mais recente para compilações de release. Suas compilações também serão reproduzíveis.
Atualizar
Percebi alguns comentários perguntando alguns detalhes desse fluxo de trabalho. Eu direi que não usamos mais esse método e a grande razão pela qual o plug-in maven version é incorreto e, em geral, é inerentemente defeituoso.
É falha porque, para executar o plug-in de versões para ajustar as versões, todas as versões existentes precisam existir para que o pom funcione corretamente. Ou seja, o plug-in de versões não pode atualizar para a versão mais recente de nada, se não conseguir encontrar a versão mencionada no pom. Isso é realmente bastante irritante, pois geralmente limpamos versões antigas por motivos de espaço em disco.
Você realmente precisa de uma ferramenta separada do maven para ajustar as versões (para que não dependa do arquivo pom para executar corretamente). Eu escrevi essa ferramenta na linguagem humilde que é o Bash. O script atualizará as versões como o plugin da versão e verificará o pom novamente no controle de origem. Também funciona 100x mais rápido que o plugin mvn version. Infelizmente, ele não está escrito de maneira a ser usado pelo público, mas se as pessoas estiverem interessadas, eu poderia fazê-lo e colocá-lo em uma essência ou github.
Voltando ao fluxo de trabalho, como alguns comentários perguntaram sobre isso, é o que fazemos:
Neste ponto, sou da opinião de que é bom ter a versão automática e de lançamento uma ferramenta separada da sua compilação geral.
Agora você pode pensar que é meio ruim por causa dos problemas listados acima, mas isso seria bastante difícil com uma ferramenta de construção que não possui uma declarativa fácil de analisar sintaxe extensível (também conhecida como XML).
De fato, adicionamos atributos XML personalizados através de namespaces para ajudar a sugerir scripts bash / groovy (por exemplo, não atualize esta versão).
fonte
A sintaxe das dependências está localizada na documentação da Especificação de Requisitos de Versão de Dependência . Aqui está a integridade:
No seu caso, você poderia fazer algo como
<version>[1.2.3,)</version>
fonte
Você possivelmente depende de versões de desenvolvimento que obviamente mudam bastante durante o desenvolvimento?
Em vez de incrementar a versão das liberações de desenvolvimento, você pode simplesmente usar uma versão de instantâneo que você sobrescreve quando necessário, o que significa que você não precisaria alterar a tag da versão em todas as alterações menores. Algo como 1.0-SNAPSHOT ...
Mas talvez você esteja tentando conseguir outra coisa;)
fonte
Quem já está usando LATEST, verifique se possui -U, caso contrário, o snapshot mais recente não será obtido.
fonte
Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
No momento em que essa pergunta foi feita, havia algumas distorções com os intervalos de versão no maven, mas eles foram resolvidos nas versões mais recentes do maven. Este artigo captura muito bem como os intervalos de versões funcionam e as práticas recomendadas para entender melhor como o maven entende as versões: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
fonte
A verdade é que mesmo no 3.x ainda funciona, surpreendentemente, os projetos são construídos e implantados. Mas a palavra-chave LATEST / RELEASE causando problemas no m2e e no eclipse por todo o lado, os projetos TAMBÉM dependem da dependência implementada por meio do LATEST / RELEASE falha ao reconhecer a versão.
Isso também causará problemas se você tentar definir a versão como propriedade e referenciá-la em outro local.
Portanto, a conclusão é usar o plugin versões-maven, se possível.
fonte
Às vezes, você não deseja usar intervalos de versões, porque parece que eles são "lentos" para resolver suas dependências, especialmente quando há entrega contínua em vigor e há várias versões - principalmente durante o desenvolvimento pesado.
Uma solução alternativa seria usar o plugin de versões maven . Por exemplo, você pode declarar uma propriedade:
e adicione o plugin-versões-maven-ao seu arquivo pom:
Então, para atualizar a dependência, você deve executar os objetivos:
Se houver uma versão mais recente que a 1.1.1, ela informará:
fonte
Se você quiser que o Maven use a versão mais recente de uma dependência, use o Versions Maven Plugin e como usar esse plugin, Tim já deu uma boa resposta, siga a resposta dele .
Mas como desenvolvedor, não vou recomendar esse tipo de prática. PORQUE?
responda por que já é dado por Pascal Thivent no comentário da pergunta
Vou recomendar este tipo de prática:
é fácil de manter e fácil de depurar. Você pode atualizar seu POM rapidamente.
fonte
MINHA solução no maven 3.5.4, use nexus, no eclipse:
depois no eclipse:,
atl + F5
e escolha oforce update of snapshots/release
funciona para mim.
fonte