Domanda

Ora che Maven-3 ha fatto goccia di sostegno per il false per manufatti snapshot sembra che si ha realmente bisogno di usare iSTANTANEE timestamp. Soprattutto m2eclipse, che fa uso Maven 3 sembra internamente essere interessati da esso, update-istantanee non funziona quando le istantanee non sono unici.

Sembrava migliori pratiche href="https://stackoverflow.com/questions/1243574/how-to-stop-maven-artifactory-from-keeping-snapshots-with-timestamps"> per impostare tutti gli snapshot a uniqueVersion = false

Ora, sembra un grosso problema per passare alla versione timestamp, dopo tutto quello che sono gestiti da un repository nesso centrale, che è in grado di eliminare i vecchi istantanee negli intervalli di regolari.

Il problema sono le workstation degli sviluppatori locali. La loro repository locale non rapidamente crescere molto di grandi dimensioni con le istantanee uniche.

Come affrontare questo problema?

In questo momento vedo le soluzioni possibili folowing:

  • Chiedi agli sviluppatori di eliminare il repository ad intervalli regolari (che porta a un sacco di fustration, come ci vuole molto tempo per eliminare e anche di più per scaricare tutto il necessario)
  • Imposta alcuni script che fa cancellare tutti ISTANTANEA directory dal repository locale e chiedere agli sviluppatori di eseguire lo script di volta in volta (meglio del primo, ma ancora prende un po 'di tempo per correre e scaricare istantanee correnti)
  • usa la dipendenza: plug-in di spurgo-local-repository (ha problemi quando viene eseguito da eclissi, a causa di file aperti, deve essere eseguito da ciascun progetto)
  • istituito nexus su ogni postazione di lavoro e impostare un lavoro di vecchie istantanee puliti (miglior risultato, ma non voglio mantenere 50+ server Nexus, oltre la memoria è sempre stretto su workstation degli sviluppatori)
  • fermata usando ISTANTANEE a tutti

Qual è il modo migliore per mantenere il vostro repository locale da riempire il vostro spazio su disco rigido?

Aggiornamento:

Per verificare l'beaviour e per dare più informazioni di configurazione ho un piccolo server nesso, la costruzione di due progetti (A e B) e provare:

A:

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

Ora, quando io uso Maven ed eseguire "implementazione" on "a", dovrò

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

nel repository locale. Con una nuova versione timestamp ogni volta che faccio funzionare il target deploy. Lo stesso accade quando si tenta di istantanee aggiornamento dal server Nexus (vicino "a" Progetto, relativa eliminazione dal deposito locale, costruire "b")

In un ambiente in cui un sacco di istantanee get build (si pensi server di Hudson ...), il reposioty locale si riempie con le vecchie versioni veloce

Aggiornamento 2:

per verificare come e perché questo sta venendo a mancare Ho fatto alcuni altri esami. Ogni test viene eseguito su tutto pulito (de / Glauche ottiene cancellazione da entrambe le macchine e Nexus)

  • mvn Distribuisci con Maven 2.2.1:

repository locale sulla macchina A non contiene snapshot.jar + snapshot-timestamp.jar

MA: solo un vaso timestamp nel Nexus, i metadati si legge:

<?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>
  • dipendenze di esecuzione dell'aggiornamento (sulla macchina B) in m2eclipse (incorporato m3 finale) -> repository locale ha snapshot.jar + snapshot-timestamp.jar: (
  • eseguire obiettivo pacchetto con Maven esterna 2.2.1 -> repository locale ha snapshot.jar + snapshot-timestamp.jar: (

Ok, la prossima prova con Maven 3.0.1 (dopo aver rimosso ogni traccia di progetto a)

  • repository locale sugli sguardi macchina una migliore, un solo un vaso non timestamp

  • solo un barattolo di timestamp nel Nexus, i metadati si legge:

      de.glauche   un'   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>
    

  • dipendenze di esecuzione dell'aggiornamento (sulla macchina B) a m2eclipse (incorporato m3 finale) -> repository locale ha snapshot.jar + snapshot-timestamp.jar: (

  • eseguire obiettivo pacchetto con Maven esterna 2.2.1 -> repository locale ha snapshot.jar + snapshot-timestamp.jar: (

Quindi, per ricapitolare: l'obiettivo "implementazione" in maven3 funziona meglio che in 2.2.1, il repository locale sulla macchina creando guarda bene. Ma, il ricevitore si conclude sempre con un sacco di versioni timestamed ...

Che cosa sono io che faccio male?

Aggiorna 3

Ho anche fatto dei test varie altre configurazioni, prima di sostituire nesso con Artifactory -> stesso comportamento. Quindi utilizzare linux Maven 3 ai clienti di scaricare le istantanee dal repository manager -> repository locale ha ancora istantanee timestamp: (

È stato utile?

Soluzione

La configurazione <uniqueVersion> applicato a manufatti che sono stati distribuiti (via implementazione mvn) per un Maven repository come Nexus.

Per rimuovere questi dal Nexus, è possibile creare facilmente una procedura automatica per eliminare il repository snapshot di tutti i giorni. Può essere configurato per mantenere un certo numero di shapshots o tenerli per un certo periodo di tempo. La sua super facile e funziona alla grande.

Artefatti nel repository locale su una macchina sviluppatore arrivare dalla meta "install" e non utilizzare questi timestamp ... hanno appena mantenere sostituendo la sola e unica versione ISTANTANEA a meno che non si sta anche incrementando il numero di revisione (ad esempio, 1,0 0,0-SNAPSHOT a 1.0.1-SNAPSHOT).

Altri suggerimenti

Questo plugin rimuove gli artefatti del progetto dal repository locale. Utile per mantenere una sola copia di grandi un'istantanea locale.

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

Per quanto riguarda la parte remota repository di questo, penso che le risposte precedenti che discutono uno spurgo di istantanee su un normale lavoro di volontà di intervallo. Ma nessuno ha affrontato la parte di sincronizzazione workstation locale-sviluppatore della tua domanda.

Non abbiamo iniziato a utilizzare Maven3 ancora, quindi dobbiamo ancora vedere istantanee di iniziare a costruire su macchine locali.

Ma abbiamo avuto diversi problemi con m2eclipse. Quando avremo "Area di lavoro Risoluzione" abilitato e il progetto esiste all'interno della nostra area di lavoro, gli aggiornamenti di origine di solito ci tengono sul bordo sanguinamento. Ma abbiamo trovato è molto difficile ottenere m2eclipse di aggiornarsi con i manufatti di recente pubblicazione a Nexus. Stiamo vivendo problemi simili all'interno della nostra squadra ed è particolarmente problematico perché abbiamo una molto grande grafico progetto ... ci sono un sacco di dipendenze che non saranno nel vostro luogo di lavoro, ma sarà sempre istantanee pubblicati frequentemente.

Sono abbastanza sicuro che questo si riduce di nuovo a un problema in m2eclipse dove non gestisce le istantanee esattamente come dovrebbe. Si può vedere nella console Maven all'interno di Eclipse in cui m2eclipse ti dice che è saltare l'aggiornamento di uno snapshot di recente pubblicazione perché ha una versione in cache. Se fate una U da una configurazione di esecuzione o dalla riga di comando, Maven riprenderà il cambiamento dei metadati. Ma un "Aggiornamento istantanee ..." selezione dovrebbe dirvi m2eclipse avere Maven scadenza questa cache. Non sembra essere sempre passato insieme. Sembra che ci sia un bug là fuori che viene archiviato per questo se siete interessati nel voto per esso: https://issues.sonatype.org/browse/MNGECLIPSE-2608

È fatto menzione di questo in un commento da qualche parte.

La soluzione migliore per questo problema sembra avere gli sviluppatori di spurgo loro stazioni di lavoro locali quando le cose iniziano ad abbattere dall'interno m2eclipse. soluzione simile a un problema diverso ... Altri hanno segnalato problemi con Maven 2.2.1 e 3 supporto m2eclipse, e ho visto la stessa.

mi auguro se si sta utilizzando Maven3 è possibile configurarlo per tirare solo l'ultimo snapshot e cache che per la quantità di tempo che il repository dice (o fino a quando non scadono a mano). Speriamo allora non avrete bisogno di avere un po 'di istantanee che si siedono nel vostro repository locale.

Questo è il meno che si sta parlando di un build server che sta facendo manualmente una mvn install su di loro. Per quanto riguarda come evitare che le istantanee da costruire in un ambiente come un build server, abbiamo tipo di schivato quel proiettile avendo ogni utilizzo costruire il proprio spazio di lavoro e deposito locale (anche se, in Maven 2.2.1, alcune cose come ad esempio POM sembrano venire sempre fuori dal ~ / .m2 / repository) le istantanee in più in realtà attaccano solo in giro per un singolo accumulo e poi scartati (e scaricati di nuovo da zero). Così abbiamo visto questo approccio finisce per mangiare di più spazio per cominciare, ma si tende a rimanere più stabile di avere tutto risolto da un unico repository. Questa opzione (on Hudson) è chiamata "repository Maven uso privato" ed è sotto il pulsante Avanzate della sezione Costruire sulle configurazioni di progetto quando hai scelto di costruire con Maven. Ecco la descrizione di aiuto per quell'opzione:

  

Normalmente, Hudson utilizza il Maven locali   repository come determinato da Maven -   l'esatto processo sembra essere   non documentato, ma è   ~ / .M2 / repository e può essere ignorato   da in   ~ / .M2 / settings.xml (vedere il riferimento   per maggiori dettagli.) Questo normalmente mezzi   che tutti i lavori che vengono eseguiti su   le stesse azioni nodo un'unica Maven   repository. Il vantaggio di questo è che   è possibile salvare lo spazio su disco, ma la   rovescio della medaglia è che a volte   queste build potrebbe interferire con ciascun   altro. Ad esempio, si potrebbe finire   avendo costruisce in modo non corretto avere successo,   basta because vostro avere tutte le   dipendenze nel repository locale,   nonostante il fatto che nessuno dei   repository in POM potrebbero avere loro.

     

Ci sono anche alcuni problemi segnalati   per quanto riguarda avere concomitante Maven   processi cercando di utilizzare lo stesso locale   repository.

     

Quando questa opzione è selezionata, Hudson   dirà Maven da usare   $ WORKSPACE / .repository come il locale   repository Maven. Questo significa che ogni lavoro   otterrà un proprio isolato Maven   repository solo per se stessa. fissa   i problemi di cui sopra, a scapito di   ulteriore consumo di spazio su disco.

     

Quando si utilizza questa opzione, si consideri   la creazione di un gestore di artefatto Maven così   che non si dispone di colpire a distanza   Maven repository troppo spesso.

     

Se preferisci per attivare questa modalità   in tutti i lavori eseguiti su Maven   Hudson, fare riferimento alla tecnica   descritto qui.

Spero che questo aiuti -. Se non risolve il problema per favore fatemelo sapere dove ho perso

in Groovy , l'eliminazione di file timestamp come artifact-0.0.1-20101204.150527-6.jar può essere molto semplice:

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()
  }
}

Groovy , Salva lo script in un file e pianificare l'esecuzione ad ogni settimana, inizio, di accesso , qualunque cosa vi si addice.

In alternativa, si può anche collegare l'esecuzione in costruzione Maven, utilizzando gmavenplus-plugin . Si noti, come è l'insieme posizione repository Maven nel settings.localRepository proprietà e quindi rilegato attraverso la configurazione in repository variabile:

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

Aggiungi seguente parametro nel file POM

POM

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

https://maven.apache.org/plugins/ Maven-dipendenza-plugin / copia-mojo.html

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

Configura in Jenkins:

// copy artifact 
copyMavenArtifact(artifact: "commons-collections:commons-collections:3.2.2:jar", outputAbsoluteArtifactFilename: "${pwd()}/target/my-folder/commons-collections.jar")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top