¿Qué es exactamente una instantánea Maven y por qué la necesitamos?

Respuestas:

1013

Una versión de instantánea en Maven es una que no ha sido lanzada.

La idea es que antes de que 1.0se 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.0en desarrollo". Esto podría estar cerca de un 1.0lanzamiento real , o bastante lejos (justo después del 0.9lanzamiento, 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-SNAPSHOThoy 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.

Joachim Sauer
fuente
67
@amphibient: No, la instantánea no es necesariamente más estable: es solo la última versión. La instantánea precede al lanzamiento real, no viene después. De hecho, los números de versión generalmente no se refieren a ramas.
avandeursen
99
Las instantáneas de @avandeursen no tienen necesariamente la semántica que reclamas. Puede tener "master-SNAPSHOT" y luego hacer una versión 1.0. no tiene que ser "FutureVersion-SNAPSHOT", ni necesariamente preceder a un lanzamiento. Sin embargo, todo lo demás es correcto: es una referencia inestable a un objetivo en movimiento y no se puede confiar en que produzca una construcción repetible.
Scott Carey,
3
Gracias @ScottCarey. "Comúnmente precede" probablemente sería más preciso, ya que ni siquiera hay una garantía de que el "objetivo móvil" eventualmente exista.
avandeursen
1
@ Jay: no, por lo que sé, no hay forma de hacer referencia explícita a una INSTANTÁNEA específica, no son direccionables / intercambiables por diseño. Si necesita un control de versiones detallado, simplemente debe liberar candidatos de lanzamiento con cadenas de versión específicas (-RC1, -RC2 o algo así).
Joachim Sauer
14
¿Por qué no pueden simplemente llamarlo " 1.0-DEVELOPMENT", o como " 1.0-INPROGRESS", ¿por qué la gente tiene que usar términos no obvias
uh_big_mike_boi
792

Las otras tres respuestas le brindan una buena visión de lo que es una -SNAPSHOTversión. Solo quería agregar información sobre el comportamiento de Maven cuando encuentra una SNAPSHOTdependencia.

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.xmlo 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.jarbiblioteca 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.jarbiblioteca, 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:

  • siempre : Maven buscará una versión más nueva en cada compilación;
  • diario , el valor predeterminado;
  • intervalo: XXX : un intervalo en minutos (XXX)
  • nunca : Maven nunca intentará recuperar otra versión. Lo hará solo si no existe localmente. Con la configuración, la SNAPSHOTversión se manejará como las bibliotecas estables.

(El modelo de settings.xml se puede encontrar aquí)

Romain Linsolas
fuente
2
Parece que es posible usar el interruptor de línea de comando para forzar que Maven vuelva a descargar todas las SNAPSHOTversiones: mvn clean package -Usegún el tutorial de Maven
Dimitry K
3
Cuidado con la -Ubandera. Es posible que no haga lo que espera debido a MNG-4142 .
Kevin Cross
3
También vale la pena mencionar que las buenas prácticas requieren que no uses dependencias de instantáneas cuando creas una versión de lanzamiento, y de hecho el complemento de lanzamiento de Maven fallará si hay dependencias de instantáneas presentes.
RCross
2
Corrí mvn installpara 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 installdespués de hacer cambios?
Don Cheadle
1
@mmcrae AFAIK debería actualizarse. Eso es lo que hace el objetivo de instalación , actualizar los frascos SNAPSHOT locales. ¿Has descubierto algo más?
Johnny
73

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 .

jjnguy
fuente
En términos de versiones semánticas , una versión -SNAPSHOT sería una versión preliminar: " Una versión previa al lanzamiento indica que la versión es inestable y podría no satisfacer los requisitos de compatibilidad previstos como se indica en su versión normal asociada. Ejemplos: 1.0.0 -alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92. "
avanza el
3
A mí me parece que "INSTANTÁNEA" no es una "instantánea de su código en un momento específico" sino más bien "la última versión disponible del código". Si esto fuera HTTP, sería la bandera que dice: "No te molestes en hacer un HEAD, ve a buscar lo que esté en el servidor de todos modos". De hecho, es casi el "código opuesto en un momento dado".
lilbyrdie
¿Qué es el desarrollo "pesado"?
Joker
1
@Joker "pesado" es cuando muchas cosas están cambiando (nuevas características, refactorización, etc.)
Robert
28

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. ;)

Peter Lawrey
fuente
21

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>

Maven

Un ejemplo de proceso de lanzamiento de Maven

ingrese la descripción de la imagen aquí

Joby Wilson Mathews
fuente
6

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 -SNAPSHOTpero 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.4una 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.4una 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.5es 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).
Garret Wilson
fuente
¿Tiene alguna información sobre cómo maneja Maven los metadatos de compilación o las convenciones de nomenclatura previas al lanzamiento? Quiero decir, todos sabemos que alfa precede a beta, pero ¿sabe maven? Incluso si toma 1.2.3-beta.4 como una versión estable, ¿sabe al menos que 1.2.3 está DESPUÉS?
DGoiko
5

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.

Kati Holasz
fuente
5

generalmente en Maven tenemos dos tipos de compilaciones 1) Compilaciones de instantáneas 2) Compilaciones de lanzamiento

  1. 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.

  2. Release builds: Release significa eliminar SNAPSHOT en la versión para la compilación, estas son las versiones de compilación normales.

Venky Vungarala
fuente
3

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

shanika prasangika
fuente
1

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.

CCNA
fuente
1

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.

Mahdi Soltani
fuente
0

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.

Sourabh Bhavsar
fuente