Maintenant que maven-3 a supprimé la prise en charge de <uniqueVersion> false </uniqueVersion> pour les artefacts de snapshot, il semble que vous ayez vraiment besoin d'utiliser des SNAPSHOTS horodatés. Surtout m2eclipse, qui utilise maven 3 en interne semble être affecté par lui, update-snapshots ne fonctionne pas lorsque les SNAPSHOTS ne sont pas uniques.
Il semblait préférable avant de définir tous les instantanés sur uniqueVersion = false
Maintenant, cela ne semble pas un gros problème de passer à la version horodatée, après tout, ils sont gérés par un référentiel central nexus, qui est capable de supprimer les anciens instantanés dans des intervalles réguliers.
Le problème, ce sont les postes de travail des développeurs locaux. Leur référentiel local devient rapidement très volumineux avec des instantanés uniques.
Comment faire face à ce problème?
En ce moment, je vois les solutions possibles suivantes:
- Demandez aux développeurs de purger le référentiel à intervalles réguliers (ce qui conduit à beaucoup de frustration, car il faut beaucoup de temps pour supprimer et encore plus pour télécharger tout le nécessaire)
- Configurez un script qui supprime tous les répertoires SNAPSHOT du référentiel local et demandez aux développeurs d'exécuter ce script de temps en temps (mieux que le premier, mais prend encore un certain temps à exécuter et télécharger les instantanés actuels)
- utiliser la dépendance: plugin purge-local-repository (a des problèmes lors de l'exécution à partir d'éclipse, en raison de fichiers ouverts, doit être exécuté à partir de chaque projet)
- configurer nexus sur chaque poste de travail et configurer un travail pour nettoyer les anciens instantanés (meilleur résultat, mais je ne veux pas maintenir plus de 50 serveurs nexus, plus la mémoire est toujours restreinte sur les postes de travail des développeurs)
- arrêter d'utiliser SNAPSHOTS du tout
Quelle est la meilleure façon d'empêcher votre dépôt local de remplir votre espace disque dur?
Mise à jour:
Pour vérifier le beaviour et pour donner plus d'informations, j'ai configuré un petit serveur nexus, construisez deux projets (a et b) et essayez:
une:
<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>
b:
<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>
Maintenant, quand j'utilise maven et que j'exécute "deploy" sur "a", j'aurai
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
dans le référentiel local. Avec une nouvelle version d'horodatage à chaque fois que j'exécute la cible de déploiement. La même chose se produit lorsque j'essaye de mettre à jour des instantanés à partir du serveur nexus (fermez "un" projet, supprimez-le du référentiel local, construisez "b")
Dans un environnement où beaucoup de clichés get build (pensez serveur hudson ...), la reposioty locale se remplit avec les anciennes versions rapides
Mise à jour 2:
Pour tester comment et pourquoi cela échoue, j'ai fait d'autres tests. Chaque test est exécuté contre tout nettoyer (de / glauche est supprimé des deux machines et du nexus)
- mvn deploy avec maven 2.2.1:
le référentiel local sur la machine A contient snapshot.jar + snapshot-timestamp.jar
MAIS: un seul pot horodaté dans nexus, les métadonnées se lisent:
<?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>
- exécuter les dépendances de mise à jour (sur la machine B) dans m2eclipse (intégré m3 final) -> le référentiel local a snapshot.jar + snapshot-timestamp.jar :(
- Lancer l'objectif du package avec maven externe 2.2.1 -> le référentiel local a snapshot.jar + snapshot-timestamp.jar :(
Ok, essayez ensuite avec maven 3.0.1 (après avoir supprimé toutes les traces du projet a)
le référentiel local sur la machine A est meilleur, un seul fichier jar non horodaté
un seul pot horodaté dans nexus, les métadonnées se lisent:
de.glauche a 0.0.1-SNAPSHOT
<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>
exécuter les dépendances de mise à jour (sur la machine B) dans m2eclipse (intégré m3 final) -> le référentiel local a snapshot.jar + snapshot-timestamp.jar :(
Lancer l'objectif du package avec maven externe 2.2.1 -> le référentiel local a snapshot.jar + snapshot-timestamp.jar :(
Donc, pour récapituler: l'objectif "déployer" dans maven3 fonctionne mieux que dans 2.2.1, le référentiel local sur la machine de création semble bien. Mais, le récepteur se termine toujours avec beaucoup de versions horodatées ...
Qu'est-ce que je fais mal ?
Mise à jour 3
J'ai également testé diverses autres configurations, d'abord remplacer le nexus par un artificiel -> même comportement. Ensuite, utilisez les clients linux maven 3 pour télécharger les instantanés à partir du gestionnaire de référentiel -> le référentiel local a toujours des instantanés horodatés :(