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


Estoy un poco confundido sobre el significado de una instantánea Maven y por qué construimos una?


641
2018-05-05 16:50


origen


Respuestas:


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

La idea es que antes de un 1.0 lanzamiento (o cualquier otra versión) está hecho, existe una 1.0-SNAPSHOT. Esa versión es lo que podría convertirse  1.0. Básicamente es "1.0 en desarrollo ". Esto podría ser cerca a un verdadero 1.0 lanzamiento, 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 recibir actualizaciones. Eso significa que la descarga 1.0-SNAPSHOT hoy podría dar un archivo diferente que descargarlo ayer o mañana.

Por lo general, las dependencias de instantáneas deberían solamente existe durante el desarrollo y ninguna versión lanzada (es decir, ninguna instantánea no) debe tener una dependencia en una versión de instantánea.


738
2018-05-05 16:57



Las otras tres respuestas le proporcionan una buena visión de lo que es -SNAPSHOT la versión es. Solo quería agregar algo de información sobre el comportamiento de Maven cuando encuentra una SNAPSHOT dependencia.

Cuando construyes una aplicación, Maven buscará dependencias en el local repositorio. 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, un foo-1.0.jar la biblioteca se considera como una estable versión, y si Maven lo encuentra en el repositorio local, usará este para la compilación actual.

Ahora, si necesitas un 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, este control se realiza solo una vez por día. Eso significa que si tienes un foo-1.0-20110506.110000-1.jar (es decir, esta biblioteca se ha generado en 2011/05/06 a las 11:00:00) en su repositorio local, y si ejecuta la compilación de Maven nuevamente el mismo día, Maven no revisa los repositorios para una versión más nueva.

Maven le proporciona una forma 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. Hará eso solo si no existe localmente. Con la configuración, SNAPSHOT la versión se manejará como las bibliotecas estables.

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


663
2018-05-06 06:41



El término "SNAPSHOT" significa que la compilación es una instantánea de su código en un momento dado.

Por lo general, significa que la versión es una versión aún en desarrollo.

Cuando llega el momento de lanzar su código, querrá cambiar la versión que figura en el pom. Entonces, en lugar de tener un "SNAPSHOT" tendrías algo así como "1.0".

Para obtener ayuda con el control de versiones, consulte el Especificación de versiones semánticas.


50
2018-05-05 16:55



Un "lanzamiento" es la construcción final para una versión que no cambia.

Una "instantánea" es una construcción que puede ser reemplazada por otra versión que tenga el mismo nombre. Esto implica que la construcción podría cambiar en cualquier momento y aún está en desarrollo activo.

Tiene diferentes artefactos para diferentes compilaciones basadas en el mismo código. P.ej. es posible que tenga uno con la depuración y otro sin él. Uno para Java 5.0 y otro para Java 6. En general, es más sencillo tener una compilación que hace todo lo que necesita. ;)


20
2018-05-05 16:54



Las versiones de Maven pueden contener una cadena literal "SNAPSHOT" para indicar que un proyecto se encuentra actualmente en desarrollo activo.

Por ejemplo, si su proyecto tiene una versión de "1.0-SNAPSHOT" 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 un lanzamiento a las 11:08 PM del 7 de febrero de 2008 UTC. En otras palabras, cuando tu implementar una instantánea, no está haciendo una versión de un componente de software; usted está lanzando una instantánea de un componente en un momento específico.

Por lo tanto, principalmente 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 instantánea, y Maven intentará periódicamente para descargar la última instantánea de un repositorio cuando ejecuta una compilación. Del mismo modo, si la próxima versión de su sistema tendrá una versión "1.8", su proyecto tener una versión "1.8-SNAPSHOT" hasta que se lance formalmente.

Por ejemplo, la siguiente dependencia siempre descargaría el último 1.8 JAR de desarrollo de la primavera:

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring</artifactId>
        <version>1.8-SNAPSHOT”</version>
    </dependency>

Maven

Un ejemplo del proceso de lanzamiento de maven

enter image description here


7
2017-07-13 13:46



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 por:

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


3
2017-12-02 12:08



por lo general en Maven tenemos dos tipos de construcciones 1) compilaciones de instantáneas 2) versiones de lanzamiento

  1. compilaciones de instantánea: SNAPSHOT es la versión especial que indica que la copia de implementación actual no es como una versión normal, maven verifica la versión para cada compilación en el repositorio remoto por lo que las compilaciones de instantáneas no son más que construcciones de mantenimiento.

  2. Versiones de lanzamiento: Liberar significa eliminar SNAPSHOT en la versión para la construcción, estas son las versiones de compilación habituales.


1
2017-08-08 07:14