Question

Maintenant que maven-3 a fait soutien drop pour false pour des objets de l'instantané, il semble que vous avez vraiment besoin d'utiliser sNAPSHOTS horodatés. Surtout m2eclipse, qui ne Maven 3 semble en interne pour être affecté avec elle, mise à jour-instantanés ne fonctionne pas lorsque les clichés ne sont pas uniques.

Il a semblé la meilleure pratique avant pour définir tous les instantanés à uniqueVersion = false

Maintenant, il semble pas de gros problème pour passer à la version horodatées, après tout, ils sont gérés par un référentiel central nexus, qui est capable de supprimer les anciens clichés dans intervalls réguliers.

Le problème sont les postes de travail des développeurs locaux. Leur dépôt local ne rapidement croître très grand avec des instantanés uniques.

Comment faire face à ce problème?

En ce moment, je vois les folowing solutions possibles:

  • Demandez aux développeurs de purger le dépôt dans des intervalles réguliers (ce qui conduit à beaucoup de fustration, car il faut beaucoup de temps pour supprimer et plus encore pour tout téléchargement nécessaire)
  • Configurer un script qui ne supprime tous les Instantané répertoires à partir du dépôt local et demander aux développeurs d'exécuter ce script de temps à autre (mieux que la première, mais prend toujours un certain temps à courir et télécharger des instantanés actuels)
  • utilisez la dépendance: plug-in purge-dépôt local (Est ont des problèmes quand il est lancé depuis Eclipse, en raison de fichiers ouverts, doit être exécuté à partir de chaque projet)
  • mis en place sur chaque poste de travail nexus et mis en place un travail pour nettoyer les anciens clichés (meilleur résultat, mais je ne veux pas maintenir plus de 50 serveurs de nexus, plus la mémoire est toujours serré sur les postes de travail de développement)
  • cesser d'utiliser SNAPSHOTS du tout

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

Mise à jour:

Pour vérifier l'beaviour et de donner plus d'informations i installer un petit serveur de lien, la construction de deux projets (a et b) et essayer:

<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 je Maven et exécuter « deploy » sur « un », 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 une nouvelle version d'horodatage à chaque fois que je lance la cible de déploiement. La même chose se produit lorsque je tente de mettre à jour des images à partir du serveur de lien (fermer « un » projet, supprimez-le du référentiel local, construire « b »)

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

Mise à jour 2:

Pour tester comment et pourquoi cela est un échec je l'ai fait d'autres tests. Chaque test est exécuté sur tout propre (de / Glauche obtient suppression des deux machines et lien)

  • mvn deploy avec Maven 2.2.1:

référentiel local sur l'ordinateur A ne contient SNAPSHOT.jar + snapshot-timestamp.jar

: un seul pot horodatées en lien, 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>
  • dépendances de mise à jour d'exécution (sur la machine B) dans m2eclipse (incorporé m3 final) -> référentiel local a SNAPSHOT.jar + snapshot-timestamp.jar: (
  • run objectif package avec Maven externe 2.2.1 -> référentiel local a SNAPSHOT.jar + instantané-timestamp.jar: (

Ok Ensuite, essayez avec Maven 3.0.1 (après avoir enlevé toute trace de projet a)

  • dépôt local sur la machine A semble mieux, seul un pot non horodatées

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

      de.glauche   une   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>
    

  • dépendances de mise à jour d'exécution (sur la machine B) dans m2eclipse (incorporé m3 final) -> référentiel local a SNAPSHOT.jar + snapshot-timestamp.jar: (

  • run but paquet avec Maven externe 2.2.1 -> référentiel local a SNAPSHOT.jar + instantané-timestamp.jar: (

Alors, pour résumer: L'objectif « deploy » dans maven3 fonctionne mieux que dans 2.2.1, le dépôt local sur la machine semble bien créer. Mais, le récepteur se termine toujours avec beaucoup de versions timestamed ...

Qu'est-ce que je fais mal?

Mise à jour 3

J'ai aussi fait tester diverses autres configurations, d'abord remplacer lien avec Artifactory -> même comportement. Ensuite, utilisez Linux Maven 3 clients pour télécharger les instantanés du gestionnaire de dépôt -> référentiel local a encore des instantanés horodatés: (

Était-ce utile?

La solution

La configuration de <uniqueVersion> appliquée à des objets qui ont été déployées (via déploiement mvn) à un référentiel Maven tel que Nexus.

Pour les supprimer de Nexus, vous pouvez facilement créer un travail automatisé pour purger le logithèque chaque jour. Il peut être configuré pour conserver un certain nombre de shapshots ou les conserver pendant une certaine période de temps. Il est super facile et fonctionne très bien.

Les artefacts dans le dépôt local sur une machine de développeur arriver de l'objectif « installer » et ne pas utiliser ces horodateurs ... ils gardent simplement remplacer une et seule version INSTANTANÉ à moins que vous aussi incrémentez le numéro de révision (par exemple 1.0 .0-SNAPSHOT à 1.0.1-snapshot).

Autres conseils

Ce plugin supprime les artefacts du projet de référentiel local. Utile pour ne garder qu'une seule copie du grand instantané local.

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

Eh bien, je ne l'ai pas comme l'une des solutions proposées. La suppression cache souvent maven augmente considérablement le trafic réseau et ralentissait processus de construction. build-aide-maven-plugin aide uniquement avec un artefact, je voulais une solution qui peut purger tous les artefacts d'instantanés horodatés obsolètes du cache local dans une simple commande. Après quelques jours de recherche, j'ai abandonné et décidé d'écrire petit programme. Le programme final semble fonctionner assez bien dans notre environnement. Alors j'ai décidé de le partager avec d'autres qui peuvent avoir besoin de ces outils. Les sources peuvent être tirés de github: https://github.com/nadestin/tools/tree/ maître / MavenCacheCleanup

En ce qui concerne la pièce à distance de dépôt, je pense que les réponses précédentes qui traitent une purge de Snapshots sur un travail intervalle régulier de volonté. Mais personne n'a abordé la partie de synchronisation du poste de travail-promoteur local de votre question.

Nous n'avons pas commencé à utiliser Maven3 encore, donc nous avons encore à voir Instantanés commencer à construire sur les machines locales.

Mais nous avons eu des problèmes différents avec m2eclipse. Lorsque nous avons « Résolution espace de travail » a permis et le projet existe au sein de notre espace de travail, les mises à jour de source conservent généralement nous sur le bord de saignement. Mais nous avons trouvé qu'il est très difficile de m2eclipse arriver à se mettre à jour avec des objets récemment publiés dans Nexus. Nous éprouvons des problèmes similaires au sein de notre équipe et il est particulièrement problématique parce que nous avons un très grand graphe du projet ... il y a beaucoup de dépendances qui ne seront pas dans votre espace de travail, mais seront publiés fréquemment se Snapshots.

Je suis assez sûr que cela se résume revenir à un problème dans m2eclipse où il ne gère pas Snapshots exactement comme il se doit. Vous pouvez le voir dans la console Maven dans Eclipse où m2eclipse vous dit qu'il est sauter la mise à jour d'un INSTANTANÉ récemment publié parce qu'il a une version mise en cache. Si vous faites un -U à partir d'une configuration d'exécution ou de la ligne de commande, Maven prendre le changement de métadonnées. Mais une sélection « Mise à jour des instantanés ... » devrait dire m2eclipse avoir Maven expirer ce cache. Il ne semble pas se passer le long. Il semble y avoir un bug là-bas qui est déposé pour cela si vous êtes intéressés à voter pour elle: https://issues.sonatype.org/browse/MNGECLIPSE-2608

Vous avez parlé de cela dans un endroit de commentaire.

La meilleure solution pour ce problème semble avoir les développeurs purger leurs postes de travail locaux quand les choses commencent à se briser à l'intérieur m2eclipse. solution similaire à un autre problème ... D'autres ont signalé des problèmes avec Maven 2.2.1 et 3 m2eclipse soutien, et je l'ai vu la même chose.

J'espère si vous utilisez Maven3 vous pouvez le configurer pour ne tirer le dernier snapshot, et cache pour la quantité de temps le dépôt dit (ou jusqu'à ce que vous expirez par la main). Si tout va bien, alors vous aurez pas besoin d'avoir un tas de Snapshots assis dans votre dépôt local.

C'est à moins que vous parlez d'un serveur de build qui fait manuellement un mvn install sur eux. En ce qui concerne la façon de prévenir Instantanés de construire sur un environnement comme un serveur de build, nous avons de type esquivé cette balle en ayant chaque génération utilise son propre espace de travail et dépôt local (bien que, dans Maven 2.2.1, certaines choses telles que POMs semblent toujours sortir du ~ / .m2 / dépôt) les instantanés supplémentaires collent vraiment seulement autour d'une seule construction, puis ils sont déposés (et téléchargés à nouveau à partir de zéro). Nous avons donc vu cette approche ne finissent par manger plus d'espace pour commencer, mais il a tendance à rester plus stable que d'avoir tout résolu à partir d'un référentiel unique. Cette option (sur Hudson) est appelée « Utiliser le référentiel Maven privé » et est sous le bouton Avancé de la section de construction sur les configurations de projet lorsque vous avez choisi de construire avec Maven. Voici la description de l'aide pour cette option:

  

Normalement, Hudson utilise la Maven locale   référentiel tel que déterminé par Maven -   le processus exact semble être   non documenté, mais il est   ~ / .M2 / dépôt et peut être débrayé   par dans   ~ / .M2 / settings.xml (voir la référence   pour plus de détails.) Ce moyen normalement   que tous les travaux qui sont exécutés sur   les mêmes actions de noeud unique Maven   dépôt. Le côté positif est que   vous pouvez enregistrer l'espace disque, mais le   inconvénient est que, parfois,   les builds pourraient interférer entre eux   autre. Par exemple, vous pourriez finir   ayant builds réussir correctement,   juste becAuse votre avoir toutes les   dépendances dans votre référentiel local,   malgré le fait qu'aucun des   les dépôts en POM pourraient avoir.

     

Il y a aussi quelques problèmes signalés   en ce qui concerne Maven ayant en même temps   processus en essayant d'utiliser les mêmes locaux   dépôt.

     

Lorsque cette option est cochée, Hudson   à Maven utiliser   $ Workspace / .repository comme local   dépôt 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 des   plus la consommation d'espace disque.

     

Lorsque vous utilisez cette option, pensez à   la mise en place d'un gestionnaire d'artefact Maven donc   que vous n'avez pas de frapper à distance   Maven dépôts trop souvent.

     

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

Hope this helps -. Si elle ne traite pas votre problème s'il vous plaît laissez-moi savoir où je manqué

Dans groovy , la suppression de fichiers horodatés comme artifact-0.0.1-20101204.150527-6.jar peut être très simple:

root = 'path to your repository'

new File(root).eachFileRecurse {
  if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
    println 'Deleting ' + it.name
    it.delete()
  }
}

Installer Groovy , enregistrez le script dans un fichier et de planifier l'exécution à chaque semaine, commencer, l'ouverture de session , tout ce que vous convient le mieux.

Ou, vous pouvez même câbler l'exécution en build Maven, en utilisant gmavenplus-plugin . Avis, comment est l'ensemble de l'emplacement du référentiel par Maven dans le settings.localRepository de la propriété puis binded par la configuration en repository variable:

  <plugin>
    <groupId>org.codehaus.gmavenplus</groupId>
    <artifactId>gmavenplus-plugin</artifactId>
    <version>1.3</version>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>execute</goal>
        </goals>
      </execution>
    </executions>
    <configuration>
      <properties>
        <property>
          <name>repository</name>
          <value>${settings.localRepository}</value>
        </property>
      </properties>
      <scripts>
        <script><![CDATA[
          new File(repository).eachFileRecurse {
            if (it.name.matches(/.*\-\d{8}\.\d{6}\-\d+\.[\w\.]+$/)) {
              println 'Deleting snapshot ' + it.getAbsolutePath()
              it.delete()
            }
          }
        ]]></script>
      </scripts>
    </configuration>
    <dependencies>
      <dependency>
        <groupId>org.codehaus.groovy</groupId>
        <artifactId>groovy-all</artifactId>
        <version>2.3.7</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  </plugin>  

Ajoutez le paramètre suivant dans votre fichier POM

POM

<configuration>
<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>
</configuration>

https://maven.apache.org/plugins/ maven-dependency-plugin / copier-mojo.html

Exemple POM

<plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.10</version>
        <executions>
          <execution>
            <id>copy</id>
            <phase>package</phase>
            <goals>
              <goal>copy</goal>
            </goals>
            <configuration>
              <artifactItems>
                <artifactItem>
                  <groupId>junit</groupId>
                  <artifactId>junit</artifactId>
                  <version>3.8.1</version>
                  <type>jar</type>
                  <overWrite>false</overWrite>
                  <outputDirectory>${project.build.directory}/alternateLocation</outputDirectory>
                  <destFileName>optional-new-name.jar</destFileName>
                </artifactItem>
              </artifactItems>
              **<outputAbsoluteArtifactFilename>true</outputAbsoluteArtifactFilename>**
              <outputDirectory>${project.build.directory}/wars</outputDirectory>
              <overWriteReleases>false</overWriteReleases>
              <overWriteSnapshots>true</overWriteSnapshots>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

Configurer dans Jenkins:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top