NOTA:
Esta respuesta se aplica a Maven 2 solamente! Los LATEST
y RELEASE
menversions mencionados have been dropped in Maven 3 "for the sake of reproducible builds", hace más de 6 años. Por favor, consulte este Maven 3 compliant solution.
Si siempre quiere usar la última versión, 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á utilizando.
Cuando dependes de un complemento o una dependencia, puedes utilizar el valor de versión más reciente o LIBERAR. LO MÁS RECIENTE se refiere a la última versión lanzada o instantánea de un artefacto particular, el artefacto desplegado más recientemente en un repositorio particular. RELEASE se refiere a la última versión no instantánea en el repositorio. En general, no es una buena práctica diseñar software que dependa de una versión no específica de un artefacto. Si está desarrollando software, es posible que desee utilizar LIBERACIÓN o ÚLTIMO como una conveniencia para que no tenga que actualizar los números de versión cuando se lanza una nueva versión de una biblioteca de terceros. Cuando libera el software, siempre debe asegurarse de que su proyecto dependa de versiones específicas para reducir las posibilidades de que su compilación o su proyecto se vea afectado por una versión de software que no esté bajo su control. Use ÚLTIMA y RELEASE con precaución, si es que lo hace.
Ver el POM Syntax section of the Maven book para más detalles. O ver este documento en Dependency Version Ranges, donde:
- un corchete (
[
& ]
) significa "cerrado" (ambos inclusive).
- Un paréntesis (
(
& )
) 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:
<?xml version="1.0" encoding="UTF-8"?><metadata>
<groupId>com.foo</groupId>
<artifactId>my-foo</artifactId>
<version>2.0.0</version>
<versioning>
<release>1.1.1</release>
<versions>
<version>1.0</version>
<version>1.0.1</version>
<version>1.1</version>
<version>1.1.1</version>
<version>2.0.0</version>
</versions>
<lastUpdated>20090722140000</lastUpdated>
</versioning>
</metadata>
Si se requiere una dependencia de ese artefacto, tiene las siguientes opciones (otros version ranges puede ser especificado por supuesto, sólo muestra la los relevantes aquí):
declarar una versión exacta (siempre a resolver 1.0.1):
<version>[1.0.1]</version>
Declarar una versión explícita (siempre a resolver 1.0.1 a menos que ocurra una colisión, cuando Maven seleccione una versión correspondiente):
<version>1.0.1</version>
Declara un intervalo de versiones 1.x para todos (en la actualidad se resolverá a 1.1.1):
<version>[1.0.0,2.0.0)</version>
Declarar una gama versión abierta (resolverá a 2.0.0):
<version>[1.0.0,)</version>
Declarar la versión como ACTUAL (resolverá a 2.0.0) (retirado de 3.x experto)
<version>LATEST</version>
declarar la versión que LIBERACIÓN (resolverá a 1.1.1) (retirado de 3.x experto):
<version>RELEASE</version>
Tenga en cuenta que por defecto sus propios despliegues actualizar la entrada "último" en los metadatos Maven, pero para actualizar la entrada de "liberación", debe activar el "perfil de publicación" del Maven super POM. Esto se puede hacer ya sea con "-Prelease perfil" o "-DperformRelease = true"
Vale la pena destacar que cualquier enfoque que permite Maven para recoger las versiones de dependencia (la última, la liberación y rangos de versión) puede lo deja abierto para generar problemas de tiempo, ya que las versiones posteriores pueden tener un comportamiento diferente (por ejemplo, el complemento de dependencia ha cambiado previamente un valor predeterminado de verdadero a falso, con resultados confusos).
Por lo tanto, generalmente es una buena idea definir versiones exactas en lanzamientos. Como señala Tim's answer, el maven-versions-plugin es una herramienta útil para actualizar versiones de dependencia, particularmente los objetivos versions:use-latest-versions y versions:use-latest-releases.
Realmente no recomiendo esta práctica (ni el uso de rangos de versión) por el bien de la reproducibilidad de compilación. Una compilación que comienza a fallar repentinamente por un motivo desconocido es mucho más molesto que actualizar manualmente un número de versión. –
@Martin Conozco la convención xyz-SNAPSHOT, pero estaba pensando en las bibliotecas que se lanzan en las versiones finales al repositorio (es decir, yendo de dream-library-1.2.3.jar a dream-library-1.2.4. jar, y así sucesivamente). –
@PascalThivent Actualizar manualmente un número de versión en un pom es un problema si está haciendo versiones continuas.Utilizo el plugin de versiones combinado con el plugin scm para superar esto (ver mi respuesta). –