83 votes

Comment gérez-vous efficacement les instantanés horodatés maven-3?

Maintenant que maven-3 n'a déposer, pour le <uniqueVersion>false</uniqueVersion> pour l'instantané des artefacts, il semble que vous avez vraiment besoin d'utiliser horodaté des INSTANTANÉS. Surtout m2eclipse, qui n'utiliser maven 3 en interne semble être touchés avec elle, mise à jour-les instantanés ne fonctionne pas lorsque les captures d'écran ne sont pas uniques.

Il semblait le plus pratique avant de définir tous les clichés de uniqueVersion=false

Maintenant, il semble qu'aucun gros problème pour passer à la horodaté version, après tout, ils sont gérés par une centrale nexus référentiel, qui est capable de supprimer les vieux clichés à intervalles réguliers.

Le problème locales sont les stations de travail de développeur. Leur référentiel local rapidement ne poussent très grande unique en des clichés.

Comment faire face à ce problème ?

Droit maintenant, je vois ce qui suit solutions possibles:

  • Demander aux développeurs de purger le référentiel à intervalles réguliers (ce qui conduit à beaucoup de fustration, il faut du temps pour les supprimer et même plus de temps à télécharger tout ce qui est nécessaire)
  • Configurer un script qui ne supprimer toutes INSTANTANÉ de répertoires à partir d'un référentiel local et demandez aux développeurs d'exécuter le script, de temps à autre (mieux que le premier, mais encore prend un certain temps à s'exécuter et télécharger les dernières captures d'écran)
  • l'utilisation de la dépendance:purge-local-dépôt plugin (Ne avoir des problèmes lorsque vous exécutez à partir de l'éclipse, due à l'ouverture des fichiers, doit être exécuté à partir de chaque projet)
  • configurer nexus sur chaque poste de travail et mis en place un travail pour nettoyer les vieux clichés (le meilleur résultat, mais je ne veux pas conserver 50+ nexus serveurs, plus la mémoire est toujours serré sur les stations de travail de développeur)
  • arrêter d'utiliser des INSTANTANÉS à tous

Quelle est la meilleure façon de garder votre dépôt local de remplir votre espace de disque dur ?

Mise à jour:

De vérifier la beaviour et à donner plus d'info j'ai installé un petit serveur nexus, la construction de deux projets (a et b) et d'essayer:

un:

<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, lorsque j'utilise maven et exécuter "déployer" à la "une", je vais avoir

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 un nouveau timestamp version à chaque fois que je lance le déploiement de la cible. La même chose se passe lorsque j'essaie de mettre à jour les Instantanés de la nexus serveur (fermer "un" Projet, de le supprimer à partir du référentiel local, construire le "b")

Dans un environnement où beaucoup de clichés get build (pensez à un serveur hudson ...), les locaux reposioty se remplit avec les anciennes versions rapide

Mise à jour 2:

Pour tester comment et pourquoi cela est en échec, j'ai fait des tests un peu plus. Chaque test est exécuté contre tout propre (de/glauche obtient supprimer à partir de deux machines et nexus)

  • mvn deploy avec maven 2.2.1 :

dépôt local sur Une machine qui ne contiennent snapshot.jar + snapshot-timestamp.jar

MAIS: un seul horodaté pot dans nexus, les métadonnées se lit comme suit:

<?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 la mise à jour des dépendances (sur la machine B) dans m2eclipse (embedded m3 final) -> référentiel local snapshot.jar + snapshot-timestamp.jar :(
  • exécutez le package objectif externe avec maven 2.2.1 -> référentiel local snapshot.jar + snapshot-timestamp.jar :(

Ok, à côté essayer avec maven 3.0.1 (après la suppression de toutes les traces de projet)

  • dépôt local sur la machine A l'air mieux, une seule non-datées jar

  • un seul horodaté pot dans nexus, les métadonnées se lit comme suit:

    de.glauche un 0.0.1-INSTANTANÉ

    <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 la mise à jour des dépendances (sur la machine B) dans m2eclipse (embedded m3 final) -> référentiel local snapshot.jar + snapshot-timestamp.jar :(

  • exécutez le package objectif externe avec maven 2.2.1 -> référentiel local snapshot.jar + snapshot-timestamp.jar :(

Donc, pour récapituler: Le "déploiement" de but en maven3 fonctionne mieux qu'en 2.2.1, le dépôt local sur la création de la machine a l'air bien. Mais, le récepteur se termine toujours avec beaucoup de timestamed versions ...

Ce que je fais mal ?

Mise à jour 3

J'ai aussi fait l'essai de divers autres configurations, tout d'abord remplacer le nexus avec artifactory -> même comportement. Ensuite, l'utilisation de linux maven 3 clients de télécharger les images à partir du gestionnaire de référentiel -> référentiel local a encore horodaté instantanés :(

34voto

HDave Points 6943

L' <uniqueVersion> configuration appliquée à des objets qui ont été déployés (via mvn deploy) à un repository Maven, tels que Nexus.

Pour supprimer ces de la Nexus, vous pouvez facilement créer un système automatisé de travail pour purger le référentiel de tous les jours. Il peut être configuré pour retenir un certain nombre de shapshots ou de les conserver pendant une certaine période de temps. Ses super facile et fonctionne très bien.

Des artefacts dans le dépôt local sur un ordinateur du développeur de l' "installer" objectif et de ne pas utiliser ces horodateurs...ils ont juste continuer à remplacer le seul et unique version de capture instantanée, sauf si vous en incrémentant le numéro de révision (p. ex. 1.0.0-SNAPSHOT de la version 1.0.1-SNAPSHOT).

13voto

Cathy Points 121

Ce plugin supprime les artefacts du projet du référentiel local. Utile pour ne conserver qu'une copie d'un instantané local volumineux.

 <plugin>         
    <groupId>org.codehaus.mojo</groupId>         
    <artifactId>build-helper-maven-plugin</artifactId>         
    <version>1.7</version>         
    <executions>           
        <execution>             
            <id>remove-old-artifacts</id>             
            <phase>package</phase>             
            <goals>               
                <goal>remove-project-artifact</goal>             
            </goals>            
            <configuration>  
                <removeAll>true</removeAll><!-- When true, remove all built artifacts including all versions. When false, remove all built artifacts of this project version -->             
            </configuration>          
        </execution>         
    </executions>       
</plugin>
 

7voto

yurinadestin Points 31

Mais, je ne suis pas comme tout des solutions proposées. La suppression de maven cache souvent augmente considérablement le trafic réseau et ralentit le processus de construction. construire-helper-maven-plugin permet uniquement avec un artefact, je voulais une solution qui permet de vider tous les désuet horodaté instantané des artefacts à partir du cache local dans une simple commande. Après quelques jours de recherche, j'ai renoncé et décidé d'écrire un petit programme. Le programme semble fonctionner assez bien dans notre environnement. J'ai donc décidé de le partager avec d'autres qui peuvent avoir besoin d'un tel outil. Les Sources peuvent être extraites à partir de github: https://github.com/nadestin/tools/tree/master/MavenCacheCleanup

2voto

cwash Points 1683

Aussi loin que le dépôt distant de cette pièce, je pense que les réponses précédentes que de discuter d'une purge des captures d'écran à intervalle régulier fonctionne. Mais personne n'a abordé le poste du développeur de synchronisation partie de votre question.

Nous n'avons pas commencé à l'aide de Maven3 encore, donc nous avons encore à voir des Instantanés de commencer à construire sur des machines locales.

Mais nous avons eu des problèmes différents avec m2eclipse. Quand nous avons l'espace de travail "Résolution" est activé et que le projet existe au sein de notre espace de travail, source de mises à jour généralement de nous garder sur le bord de saignement. Mais nous avons trouvé qu'il est très difficile d'obtenir m2eclipse d'une mise à jour récemment publié les artefacts dans le Nexus. Nous rencontrez des problèmes similaires au sein de notre équipe et c'est particulièrement problématique parce que nous avons un très grand projet graphique... il y a beaucoup de dépendances qui ne seront pas dans votre espace de travail, mais sera d'obtenir des Instantanés souvent publiés.

Je suis sûr que cela revient à un problème de m2eclipse où il ne gère pas les Instantanés exactement comme il se doit. Vous pouvez le voir dans le Maven de la console d'eclipse où m2eclipse vous dit qu'il est ignorant de la mise à jour d'un récemment publié INSTANTANÉ parce que c'est une version mise en cache. Si vous ne un -U à partir d'une série de configuration ou depuis la ligne de commande, Maven va ramasser la modification des métadonnées. Mais une "mise à Jour des Instantanés..." sélection devrait dire m2eclipse avoir Maven expiration de ce cache. Il ne semble pas être passé. Il semble y avoir un bug qui est déposée pour cela si vous êtes intéressé à voter pour elle: https://issues.sonatype.org/browse/MNGECLIPSE-2608

Vous avez fait mention de cela dans un commentaire quelque part.

La meilleure solution de contournement pour ce problème semble être de demander aux développeurs de purge de leurs stations de travail locales quand les choses commencent à se casser de l'intérieur de m2eclipse. Solution similaire à un autre problème... d'Autres ont signalé des problèmes avec Maven 2.2.1 et 3 de la sauvegarde de m2eclipse, et j'ai vu la même chose.

J'espère que si vous utilisez Maven3 vous pouvez le configurer pour seulement tirer la dernière SNAPSHOT, et cache que pour la quantité de temps le référentiel dit (ou jusqu'à ce que vous expirent à la main). Espérons-le, vous n'avez pas besoin d'avoir un tas de clichés assis dans votre dépôt local.

C'est moins que vous parlez d'un serveur de build qui est manuellement en faisant un mvn install . Dans la façon de prévenir les Instantanés de la construction sur l'environnement comme un serveur de build, on a esquivé la balle en ayant chaque générer l'utilisation de son propre espace de travail et référentiel local (bien que, dans Maven 2.2.1, certaines choses comme les Boutons semblent toujours sortir de l' ~/.m2/repository) Le supplément de SNAPSHOTs vraiment que de rester pour une construction unique et puis ils obtiennent une chute (et téléchargé à nouveau à partir de zéro). Nous avons donc vu cette approche ne finissez de manger plus d'espace pour commencer, mais il a tendance à rester plus stable que d'avoir tout résolu d'un référentiel unique. Cette option (Hudson) est appelée "Usage privé Maven repository" et est sous le bouton Avancé de la construction de la section sur les configurations de projet lorsque vous avez choisi de construire avec Maven. Voici l'aide de la description de l'option:

Normalement, Hudson utilise le local Maven référentiel tel que déterminé par Maven le processus exact qui semble être sans-papiers, mais c'est ~/.m2/repository et peuvent être remplacées par dans ~/.m2/settings.xml (voir la référence pour plus de détails.) Cela signifie normalement que tous les travaux qui sont exécutés sur le même nœud actions d'un seul Maven référentiel. L'avantage de ceci est que vous pouvez économiser de l'espace disque, mais le inconvénient de cette est que, parfois, ces versions pourraient interférer les uns avec les d'autres. Par exemple, vous pourriez vous retrouver ayant construit de manière incorrecte réussir, juste parce que vous avez tous les dépendances dans votre dépôt local, malgré le fait qu'aucun des référentiels en POM pourrait avoir.

Il y a aussi quelques problèmes signalés quant à avoir simultanées Maven les processus d'essayer d'utiliser le même local référentiel.

Lorsque cette option est cochée, Hudson va dire à utiliser Maven $Espace de travail/.référentiel local Repository Maven. Cela signifie que chaque emploi aura son propre isolé Maven référentiel juste pour lui-même. Il fixe les problèmes ci-dessus, au détriment de la supplémentaire de la consommation d'espace disque.

Lorsque vous utilisez cette option, envisager de la configuration d'un artefact Maven manager, de sorte que que vous n'avez pas à frapper à distance Maven référentiels trop souvent.

Si vous préférez activer ce mode dans tous les Maven travaux exécutés sur Hudson, reportez-vous à la technique décrit ici.

Espérons que cela aide - si ce n'est pas l'adresse de votre problème s'il vous plaît laissez-moi savoir où je l'ai manqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X