Ahora que maven-3 eliminó el soporte para <uniqueVersion> false </uniqueVersion> para artefactos de instantáneas, parece que realmente necesita usar SNAPSHOTS con marca de tiempo. Especialmente m2eclipse, que usa maven 3 internamente parece verse afectado por él, las instantáneas de actualización no funcionan cuando las instantáneas no son únicas.
Parecía una buena práctica antes establecer todas las instantáneas en uniqueVersion = false
Ahora, no parece un gran problema cambiar a la versión con marca de tiempo, después de todo, son administrados por un repositorio central nexus, que puede eliminar instantáneas antiguas en intervalos regulares.
El problema son las estaciones de trabajo de los desarrolladores locales. Su repositorio local rápido aumenta muy grande con instantáneas únicas.
¿Cómo lidiar con este problema?
Ahora mismo veo las siguientes posibles soluciones:
- Pida a los desarrolladores que depuren el repositorio a intervalos regulares (lo que genera mucha frustración, ya que lleva mucho tiempo eliminarlo e incluso más tiempo descargar todo lo necesario)
- Configure un script que elimine todos los directorios SNAPSHOT del repositorio local y solicite a los desarrolladores que ejecuten ese script de vez en cuando (mejor que el primero, pero aún lleva bastante tiempo ejecutar y descargar las instantáneas actuales)
- use la dependencia: plugin purge-local-repository (tiene problemas cuando se ejecuta desde eclipse, debido a archivos abiertos, debe ejecutarse desde cada proyecto)
- configurar nexus en cada estación de trabajo y configurar un trabajo para limpiar instantáneas antiguas (el mejor resultado, pero no quiero mantener más de 50 servidores nexus, además de que la memoria siempre es escasa en las estaciones de trabajo de los desarrolladores)
- dejar de usar SNAPSHOTS en absoluto
¿Cuál es la mejor manera de evitar que su repositorio local llene el espacio de su disco duro?
Actualizar:
Para verificar el beaviour y dar más información, configuro un pequeño servidor nexus, construyo dos proyectos (ayb) e intento:
una:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
</project>
segundo:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.glauche</groupId>
<artifactId>b</artifactId>
<version>0.0.1-SNAPSHOT</version>
<distributionManagement>
<snapshotRepository>
<id>nexus</id>
<name>nexus</name>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<repositories>
<repository>
<id>nexus</id>
<name>nexus</name>
<snapshots>
<enabled>true</enabled>
</snapshots>
<url>http://server:8081/nexus/content/repositories/snapshots/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Ahora, cuando uso maven y ejecuto "deploy" en "a", tendré
a-0.0.1-SNAPSHOT.jar
a-0.0.1-20101204.150527-6.jar
a-0.0.1-SNAPSHOT.pom
a-0.0.1-20101204.150527-6.pom
en el repositorio local. Con una nueva versión de marca de tiempo cada vez que ejecuto el destino de implementación. Lo mismo sucede cuando trato de actualizar Snapshots desde el servidor nexus (cerrar "a" Project, eliminarlo del repositorio local, construir "b")
En un entorno donde la gran cantidad de instantáneas consiguen acumulación (creo servidor Hudson ...), el reposioty locales se llena de versiones antiguas rápidas
Actualización 2:
Para probar cómo y por qué esto falla, hice algunas pruebas más. Cada prueba se ejecuta contra todo limpio (de / glauche se elimina de ambas máquinas y nexus)
- Implementación de mvn con maven 2.2.1:
El repositorio local en la máquina A contiene snapshot.jar + snapshot-timestamp.jar
PERO: solo un jar con marca de tiempo en nexus, los metadatos dicen:
<?xml version="1.0" encoding="UTF-8"?>
<metadata>
<groupId>de.glauche</groupId>
<artifactId>a</artifactId>
<version>0.0.1-SNAPSHOT</version>
<versioning>
<snapshot>
<timestamp>20101206.200039</timestamp>
<buildNumber>1</buildNumber>
</snapshot>
<lastUpdated>20101206200039</lastUpdated>
</versioning>
</metadata>
- ejecutar las dependencias de actualización (en la máquina B) en m2eclipse (m3 final incrustado) -> el repositorio local tiene snapshot.jar + snapshot-timestamp.jar :(
- ejecutar el objetivo del paquete con maven externo 2.2.1 -> el repositorio local tiene snapshot.jar + snapshot-timestamp.jar :(
Ok, siguiente intento con maven 3.0.1 (después de eliminar todos los rastros del proyecto a)
el repositorio local en la máquina A se ve mejor, solo un jar sin marca de tiempo
solo un jar con marca de tiempo en nexus, los metadatos dicen:
de.glauche a 0.0.1-INSTANTÁNEA
<snapshot> <timestamp>20101206.201808</timestamp> <buildNumber>3</buildNumber> </snapshot> <lastUpdated>20101206201808</lastUpdated> <snapshotVersions> <snapshotVersion> <extension>jar</extension> <value>0.0.1-20101206.201808-3</value> <updated>20101206201808</updated> </snapshotVersion> <snapshotVersion> <extension>pom</extension> <value>0.0.1-20101206.201808-3</value> <updated>20101206201808</updated> </snapshotVersion> </snapshotVersions>
ejecutar las dependencias de actualización (en la máquina B) en m2eclipse (m3 final incrustado) -> el repositorio local tiene snapshot.jar + snapshot-timestamp.jar :(
ejecutar el objetivo del paquete con maven externo 2.2.1 -> el repositorio local tiene snapshot.jar + snapshot-timestamp.jar :(
Entonces, para recapitular: el objetivo de "implementación" en maven3 funciona mejor que en 2.2.1, el repositorio local en la máquina creadora se ve bien. Pero, el receptor siempre termina con muchas versiones cronometradas ...
Qué estoy haciendo mal ?
Actualización 3
También probé varias otras configuraciones, primero reemplacé nexus con artifactory -> mismo comportamiento. Luego use clientes linux maven 3 para descargar las instantáneas del administrador del repositorio -> el repositorio local todavía tiene instantáneas con marca de tiempo :(