Respuestas:
Una versión de instantánea en Maven es una que no ha sido lanzada.
La idea es que antes de que 1.0
se realice un lanzamiento (o cualquier otro lanzamiento), existe a 1.0-SNAPSHOT
. Esa versión es lo que podría convertirse 1.0
. Básicamente está " 1.0
en desarrollo". Esto podría estar cerca de un 1.0
lanzamiento real , o bastante lejos (justo después del 0.9
lanzamiento, por ejemplo).
La diferencia entre una versión "real" y una versión de instantánea es que las instantáneas pueden obtener actualizaciones. Eso significa que la descarga de 1.0-SNAPSHOT
hoy puede dar un archivo diferente que descargarlo ayer o mañana.
Por lo general, las dependencias de la instantánea solo deben existir durante el desarrollo y ninguna versión lanzada (es decir, no instantánea) debe tener una dependencia en una versión de instantánea.
1.0-DEVELOPMENT
", o como " 1.0-INPROGRESS
", ¿por qué la gente tiene que usar términos no obvias
Las otras tres respuestas le brindan una buena visión de lo que es una -SNAPSHOT
versión. Solo quería agregar información sobre el comportamiento de Maven cuando encuentra una SNAPSHOT
dependencia.
Cuando crea una aplicación, Maven buscará dependencias en el repositorio local . Si no se encuentra una versión estable allí, buscará en los repositorios remotos (definidos en settings.xml
o pom.xml
) para recuperar esta dependencia. Luego, lo copiará en el repositorio local, para que esté disponible para las próximas compilaciones.
Por ejemplo, una foo-1.0.jar
biblioteca se considera una versión estable , y si Maven la encuentra en el repositorio local, utilizará esta para la compilación actual.
Ahora, si necesita una foo-1.0-SNAPSHOT.jar
biblioteca, Maven sabrá que esta versión no es estable y está sujeta a cambios. Es por eso que Maven intentará encontrar una versión más nueva en los repositorios remotos, incluso si se encuentra una versión de esta biblioteca en el repositorio local. Sin embargo, esta verificación se realiza solo una vez al día. Eso significa que si tienes unfoo-1.0-20110506.110000-1.jar
(es decir, esta biblioteca se generó el 06/05/2011 a las 11:00:00) en su repositorio local, y si ejecuta la compilación Maven nuevamente el mismo día, Maven no verificará los repositorios para una nueva versión
Maven le proporciona una manera de cambiar esta política de actualización en su definición de repositorio:
<repository>
<id>foo-repository</id>
<url>...</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>XXX</updatePolicy>
</snapshots>
</repository>
dónde XXX
puede ser:
SNAPSHOT
versión se manejará como las bibliotecas estables.(El modelo de settings.xml se puede encontrar aquí)
SNAPSHOT
versiones: mvn clean package -U
según el tutorial de Maven
-U
bandera. Es posible que no haga lo que espera debido a MNG-4142 .
mvn install
para instalar un jar de la versión 1.0-SNAPSHOT en mi repositorio local. Al día siguiente, hice cambios en el proyecto pero no cambié la versión; luego, al ejecutarlo mvn install
, no pareció cambiarlo en mi repositorio local. ¿Es ese comportamiento esperado? ¿No puedo reutilizar una versión y sobrescribirla mvn install
después de hacer cambios?
El término "INSTANTÁNEA" significa que la compilación es una instantánea de su código en un momento dado.
Por lo general, significa que esta versión aún está en desarrollo.
Cuando el código esté listo y sea hora de liberarlo, querrá cambiar la versión que figura en el POM. Luego, en lugar de tener un "INSTANTÁNEA", usaría una etiqueta como "1.0".
Para obtener ayuda con las versiones, consulte la especificación de versiones semánticas .
Un "lanzamiento" es la compilación final para una versión que no cambia.
Una "instantánea" es una compilación que se puede reemplazar por otra compilación que tenga el mismo nombre. Implica que la compilación podría cambiar en cualquier momento y todavía está en desarrollo activo.
Tiene diferentes artefactos para diferentes compilaciones basadas en el mismo código. Por ejemplo, puede tener uno con depuración y uno sin. Uno para Java 5.0 y otro para Java 6. Generalmente es más simple tener una compilación que haga todo lo que necesita. ;)
Las versiones de Maven pueden contener un literal de cadena "INSTANTÁNEA" para indicar que un proyecto está actualmente en desarrollo activo.
Por ejemplo, si su proyecto tiene una versión de "1.0-INSTANTÁNEA" y despliega los artefactos de este proyecto en un repositorio de Maven, Maven expandiría esta versión a "1.0-20080207-230803-1" si tuviera que implementar una versión a las 11 : 8 PM del 7 de febrero de 2008 UTC. En otras palabras, cuando implementa una instantánea, no está lanzando un componente de software; está lanzando una instantánea de un componente en un momento específico.
Por lo tanto, las versiones de instantáneas se utilizan principalmente para proyectos en desarrollo activo. Si su proyecto depende de un componente de software que se encuentra en desarrollo activo, puede confiar en una versión de instantánea, y Maven intentará periódicamente descargar la última instantánea de un repositorio cuando ejecute una compilación. Del mismo modo, si la próxima versión de su sistema tendrá una versión "1.8", su proyecto tendrá una versión "1.8-SNAPSHOT" hasta que se lance formalmente.
Por ejemplo, la siguiente dependencia siempre descargaría el último JAR de desarrollo 1.8 de spring:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>1.8-SNAPSHOT”</version>
</dependency>
Un ejemplo de proceso de lanzamiento de Maven
Me gustaría hacer un punto sobre la terminología. Las otras respuestas dieron buenas explicaciones sobre lo que es una versión "instantánea" en el contexto de Maven. Pero, ¿se deduce que una versión que no sea una instantánea debería denominarse versión de "lanzamiento"?
Existe cierta tensión entre la idea de versiones semánticas de una versión de "lanzamiento", que parece ser cualquier versión que no tiene un calificador como -SNAPSHOT
pero que tampoco tiene un calificador como -beta.4
; y la idea de Maven de una versión de "lanzamiento", que solo parece incluir la ausencia de -SNAPSHOT
.
En otras palabras, existe una ambigüedad semántica de si "lanzamiento" significa "podemos lanzarlo a Maven Central" o "el software está en su lanzamiento final al público". Podríamos considerar -beta.4
una versión de "lanzamiento" si la lanzamos al público, pero no es una "versión final". El control de versiones semántico dice claramente que algo así como -beta.4
una versión de "pre-lanzamiento", por lo que no tendría sentido que se llamara una versión de "lanzamiento", incluso sin ella -SNAPSHOT
. De hecho, por definición, incluso -rc.5
es un candidato de lanzamiento , no un lanzamiento real, a pesar de que podemos permitir el acceso público para las pruebas.
No obstante, a pesar de Maven, en mi opinión, parece más apropiado solo llamar a una versión de "lanzamiento" que no tiene ningún calificador, ni siquiera -beta.4
. Quizás un mejor nombre para una versión no instantánea de Maven sería una versión "estable" (inspirada en otra respuesta ). Así tendríamos:
1.2.3-beta.4-SNAPSHOT
: Una versión instantánea de una versión preliminar.1.2.3-SNAPSHOT
: Una versión instantánea de una versión de lanzamiento.1.2.3-beta.4
: Una versión estable de una versión preliminar.1.2.3
: Una versión de lanzamiento (que es una versión estable, no instantánea, obviamente).Así es como se ve una instantánea para un repositorio y en este caso no está habilitada, lo que significa que el repositorio al que se hace referencia aquí es estable y no hay necesidad de actualizaciones.
<project>
...
<repositories>
<repository>
<id>lds-main</id>
<name>LDS Main Repo</name>
<url>http://code.lds.org/nexus/content/groups/main-repo</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
Otro caso sería para:
<snapshots>
<enabled>true</enabled>
</snapshots>
lo que significa que Maven buscará actualizaciones para este repositorio. También puede especificar un intervalo para las actualizaciones con etiqueta.
generalmente en Maven tenemos dos tipos de compilaciones 1) Compilaciones de instantáneas 2) Compilaciones de lanzamiento
compilaciones de instantáneas: SNAPSHOT es la versión especial que indica que la copia de implementación actual no es como una versión normal, Maven comprueba la versión para cada compilación en el repositorio remoto, por lo que las compilaciones de instantáneas no son más que compilaciones de desarrollo.
Release builds: Release significa eliminar SNAPSHOT en la versión para la compilación, estas son las versiones de compilación normales.
simplemente instantánea significa que es la versión que no es estable.
cuando la versión incluye una instantánea como 1.0.0 -SNAPSHOT significa que no es una versión estable y busca repositorio remoto para resolver dependencias
Comprender el contexto de SDLC ayudará a comprender la diferencia entre la instantánea y el lanzamiento. Durante el proceso de desarrollo, todos los desarrolladores contribuyen con sus características a una rama de línea de base. En algún momento, el líder cree que se han acumulado suficientes características y luego cortará una rama de liberación de la rama de línea base. Cualquier compilación anterior a este punto de tiempo son instantáneas. Las publicaciones posteriores a este punto son lanzamientos. Tenga en cuenta que las versiones de lanzamiento también pueden cambiar antes de pasar a producción si hay algún defecto durante la prueba de lanzamiento.
Instantánea simplemente significa que, dependiendo de su configuración, Maven verificará los últimos cambios en una dependencia especial. La instantánea es inestable porque está en desarrollo, pero si un proyecto especial necesita tener los últimos cambios, debe configurar su versión de dependencia a la versión de instantánea. Este escenario ocurre en grandes organizaciones con múltiples productos que estos productos se relacionan entre sí muy de cerca.
Como su nombre indica, la instantánea se refiere al estado del proyecto y sus dependencias en ese momento. Cada vez que maven encuentra una INSTANTÁNEA más nueva del proyecto, descarga y reemplaza el archivo .jar anterior del proyecto en el repositorio local.
Las versiones de instantáneas se utilizan para proyectos en desarrollo activo. Si su proyecto depende de un componente de software que está en desarrollo activo, puede confiar en una versión de instantánea, y Maven intentará periódicamente descargar la última instantánea de un repositorio cuando ejecute una compilación.