En Maven, las dependencias generalmente se configuran así:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
Ahora, si está trabajando con bibliotecas que tienen lanzamientos frecuentes, actualizar constantemente la etiqueta <version> puede ser algo molesto. ¿Hay alguna forma de decirle a Maven que use siempre la última versión disponible (del repositorio)?
java
maven
dependencies
maven-2
maven-metadata
Anders Sandvig
fuente
fuente
Respuestas:
NOTA:
¡Esta respuesta se aplica solo a Maven 2! Las mencionadas
LATEST
y lasRELEASE
metaversiones se han eliminado en Maven 3 "por el bien de las compilaciones reproducibles" , hace más de 6 años. Consulte esta solución compatible con Maven 3 .Si siempre desea usar la versión más nueva, Maven tiene dos palabras clave que puede usar como alternativa a los rangos de versión. Debe usar estas opciones con cuidado ya que ya no tiene el control de los complementos / dependencias que está usando.
Consulte la sección Sintaxis POM del libro de Maven para más detalles. O vea este documento sobre los rangos de versión de dependencia , donde:
[
&]
) significa "cerrado" (inclusive).(
&)
) significa "abierto" (exclusivo).Aquí hay un ejemplo que ilustra las diversas opciones. En el repositorio de Maven, com.foo:my-foo tiene los siguientes metadatos:
Si se requiere una dependencia de ese artefacto, tiene las siguientes opciones ( por supuesto, se pueden especificar otros rangos de versión , solo mostrando los relevantes aquí):
Declare una versión exacta (siempre se resolverá a 1.0.1):
Declare una versión explícita (siempre se resolverá a 1.0.1 a menos que ocurra una colisión, cuando Maven seleccionará una versión coincidente):
Declare un rango de versión para todos los 1.x (actualmente se resolverá en 1.1.1):
Declare un rango de versión abierta (se resolverá a 2.0.0):
Declare la versión como ÚLTIMA (se resolverá a 2.0.0) (eliminada de maven 3.x)
Declare la versión como RELEASE (se resolverá en 1.1.1) (eliminada de maven 3.x):
Tenga en cuenta que, de manera predeterminada, sus propias implementaciones actualizarán la entrada "más reciente" en los metadatos de Maven, pero para actualizar la entrada "versión", debe activar el "perfil de versión" desde el super POM de Maven . Puede hacerlo con "-Prelease-profile" o "-DperformRelease = true"
Vale la pena enfatizar que cualquier enfoque que permita a Maven elegir las versiones de dependencia (ÚLTIMO, LIBERACIÓN y rangos de versión) puede dejarlo abierto a problemas de tiempo de compilación, ya que las versiones posteriores pueden tener un comportamiento diferente (por ejemplo, el complemento de dependencia ha cambiado previamente un valor predeterminado valor de verdadero a falso, con resultados confusos).
Por lo tanto, generalmente es una buena idea definir versiones exactas en los lanzamientos. Como señala la respuesta de Tim , el complemento de versiones de Maven es una herramienta útil para actualizar las versiones de dependencia, en particular las versiones: use-latest-version y versiones: use-latest-releases .
fuente
[1.1,2.0)
Ahora sé que este tema es antiguo, pero al leer la pregunta y la respuesta proporcionada por el OP, parece que el complemento Maven Versions podría haber sido una mejor respuesta a su pregunta:
En particular, los siguientes objetivos podrían ser útiles:
También se proporcionan los siguientes objetivos:
Solo pensé en incluirlo para cualquier referencia futura.
fuente
Consulte esta página (sección "Rangos de versión de dependencia"). Lo que tal vez quieras hacer es algo como
Estos rangos de versiones se implementan en Maven2.
fuente
mvn dependency:tree -Dverbose
resolver eso. Esto podría explicar la versión inesperada.A diferencia de otros, creo que hay muchas razones por las que siempre puedes desear la última versión. Particularmente si está realizando una implementación continua (a veces tenemos como 5 lanzamientos en un día) y no quiere hacer un proyecto de varios módulos.
Lo que hago es hacer que Hudson / Jenkins haga lo siguiente para cada compilación:
Es decir, uso el complemento de versiones y el complemento scm para actualizar las dependencias y luego lo registro en el control de origen. Sí, dejé que mi CI hiciera registros de SCM (lo que debe hacer de todos modos para el complemento de lanzamiento de Maven).
Deberá configurar el complemento de versiones para actualizar solo lo que desee:
Utilizo el complemento de lanzamiento para hacer el lanzamiento que se encarga de -SNAPSHOT y valida que hay una versión de lanzamiento de -SNAPSHOT (que es importante).
Si hace lo que hago, obtendrá la última versión para todas las compilaciones de instantáneas y la última versión de lanzamiento para las compilaciones de lanzamiento. Sus compilaciones también serán reproducibles.
Actualizar
Noté algunos comentarios preguntando algunos detalles de este flujo de trabajo. Diré que ya no usamos este método y la gran razón por la cual el complemento de versiones de Maven es defectuoso y, en general, es inherentemente defectuoso.
Es defectuoso porque para ejecutar el complemento de versiones para ajustar las versiones, todas las versiones existentes deben existir para que el pom se ejecute correctamente. Es decir, el complemento de versiones no puede actualizarse a la última versión de nada si no puede encontrar la versión a la que se hace referencia en el pom. Esto es bastante molesto ya que a menudo limpiamos versiones antiguas por razones de espacio en disco.
Realmente necesita una herramienta separada de maven para ajustar las versiones (por lo que no depende del archivo pom para ejecutarse correctamente). He escrito tal herramienta en el lenguaje humilde que es Bash. El script actualizará las versiones como el complemento de versión y volverá a verificar el pom en el control de origen. También funciona como 100 veces más rápido que el complemento de versiones mvn. Desafortunadamente, no está escrito de manera pública, pero si la gente está interesada, podría hacerlo y ponerlo en una esencia o github.
Volviendo al flujo de trabajo cuando algunos comentarios preguntaron sobre esto es lo que hacemos:
En este punto, creo que es bueno tener el lanzamiento y la versión automática de una herramienta separada de su compilación general de todos modos.
Ahora puede pensar que Maven apesta debido a los problemas enumerados anteriormente, pero esto en realidad sería bastante difícil con una herramienta de compilación que no tiene una sintaxis extensible declarativa fácil de analizar (también conocida como XML).
De hecho, agregamos atributos XML personalizados a través de espacios de nombres para ayudar a insinuar los scripts bash / groovy (por ejemplo, no actualice esta versión).
fuente
La sintaxis de dependencias se encuentra en la documentación de Especificación de requisitos de versión de dependencia . Aquí está para completar:
En tu caso, podrías hacer algo como
<version>[1.2.3,)</version>
fuente
¿Posiblemente dependas de versiones de desarrollo que obviamente cambian mucho durante el desarrollo?
En lugar de incrementar la versión de las versiones de desarrollo, podría usar una versión de instantánea que sobrescriba cuando sea necesario, lo que significa que no tendría que cambiar la etiqueta de versión en cada cambio menor. Algo así como 1.0-SNAPSHOT ...
Pero tal vez estás tratando de lograr algo más;)
fuente
Quien esté usando ÚLTIMO, asegúrese de tener -U, de lo contrario, no se extraerá la última instantánea.
fuente
Couldn't download artifact: Failed to resolve version for com.app:common:jar:LATEST
En el momento en que se planteó esta pregunta, había algunos problemas con los rangos de versión en maven, pero estos se han resuelto en versiones más recientes de maven. Este artículo captura muy bien cómo funcionan los rangos de versiones y las mejores prácticas para comprender mejor cómo Maven entiende las versiones: https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
fuente
La verdad es que incluso en 3.x todavía funciona, sorprendentemente, los proyectos se construyen y se implementan. Pero la palabra clave LATEST / RELEASE que causa problemas en m2e y eclipse por todas partes, TAMBIÉN los proyectos dependen de la dependencia que se implementó a través de LATEST / RELEASE no reconocen la versión.
También causará problemas si intenta definir la versión como propiedad y hacer referencia a ella en otro lugar.
Entonces, la conclusión es usar las versiones-maven-plugin si puedes.
fuente
A veces no desea usar rangos de versiones, porque parece que son "lentos" para resolver sus dependencias, especialmente cuando hay una entrega continua y hay toneladas de versiones, principalmente durante el desarrollo pesado.
Una solución alternativa sería utilizar las versiones-maven-plugin . Por ejemplo, puede declarar una propiedad:
y agregue las versiones-maven-plugin a su archivo pom:
Luego, para actualizar la dependencia, debe ejecutar los objetivos:
Si hay una versión más nueva que la 1.1.1, te dirá:
fuente
Si desea que Maven use la última versión de una dependencia, puede usar el complemento Versions Maven y cómo usar este complemento, Tim ya ha dado una buena respuesta, siga su respuesta .
Pero como desarrollador, no recomendaré este tipo de prácticas. ¿POR QUÉ?
respuesta a por qué ya lo dio Pascal Thivent en el comentario de la pregunta
Recomendaré este tipo de práctica:
Es fácil de mantener y fácil de depurar. Puede actualizar su POM en poco tiempo.
fuente
MI solución en maven 3.5.4, usa nexus, en eclipse:
luego en eclipse:,
atl + F5
y elija elforce update of snapshots/release
esto funciona para mi.
fuente