En repositorios como Nexus, se suelen distinguir dos tipos: repositorios para versiones de lanzamiento (release) y repositorios para versiones de instantánea (snapshot). Si en el archivo de configuración del proyecto, ya sea pom.xml o build.gradle, se especifica una versión con el sufijo '-SNAPSHOT', como 'mi-libreria-1.0-SNAPSHOT', el artefacto resultante se considera una versión de instantánea.
La diferencia principal radica en cómo se gestionan las dependencias localmente.
Para una versión estable, la herramienta de compilación verifica primero el repositorio local. Si la dependencia no está presente, la descarga del repositorio remoto y la almacena en caché. Por ejemplo, si publicas 'libreria-1.0.jar' y un proyecto la usa, esta se descarga una vez y no se vuelve a buscar en el repositorio remoto en compilaciones posteriores. Si actualizas el código y publicas una nueva versión con el mismo nombre, los proyectos dependientes no obtendrán los cambios, a menos que publiques una versión nueva, como 'libreria-1.1.jar', y actualices las dependencias en los proyectos consumidores.
Este enfoque puede ser ineficiente en entornos de desarrollo colaborativo. Considera dos equipos trabajando en 'servicio-datos' e 'interfaz-usuario', donde 'interfaz-usuario' depende de 'servicio-datos'. Si ambos se compilan frecuentemente, actualizar manualmente la versión de 'servicio-datos' en cada cambio sería engorroso. Las versiones de instantánea simplifican esto: al publicar 'servicio-datos-1.0-SNAPSHOT.jar' e indicar que 'interfaz-usuario' depende de esta versión, cada compilación de 'interfaz-usuario' verificará el repositorio remoto para obtener la versión más reciente de 'servicio-datos-1.0-SNAPSHOT.jar', incluso si ya está en caché localmente.
Para evitar consultas excesivas al repositorio remoto, Maven permite configurar estrategias de actualización para dependencias de instantánea. Las opciones disponibles son: always (siempre), daily (diario), interval (intervalo) y never (nunca). En la configuración del repositorio, se establece la política de actualización.
Ejemplo de configuración en Maven (pom.xml):
<repository>
<id>repositorio-central</id>
<url>https://ejemplo.com/repositorio</url>
<snapshots>
<enabled>true</enabled>
<updatePolicy>daily</updatePolicy>
</snapshots>
</repository>
El valor de updatePolicy puede ser: always, daily, interval:XX (donde XX es el intervalo en minutos) o never. La opción daily es la predeterminada.
En Gradle, se puede definir una estrategia de caché para dependencias cambiantes:
configurations.all {
// Actualizar en cada compilación
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
// O establecer un intervalo, por ejemplo:
// resolutionStrategy.cacheChangingModulesFor 15, 'minutes'
}
En el ciclo de desarrollo, es común publicar versiones de instantánea con frecuencia para facilitar la integración continua entre equipos. Una vez que el software alcanza la estabilidad, se publica una versión estable sin sufijos SNAPSHOT, asegurando que todas las dependencias en el proyecto sean también versiones estables para garantizar la fiabilidad en producción.