Come si fa a trattare con Maven-3 istantanee timestamp in modo efficiente?
Domanda
Ora che Maven-3 ha fatto goccia di sostegno per il
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: (
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>
Beh non mi piaceva nessuna delle soluzioni proposte. L'eliminazione della cache Maven spesso aumenta in modo significativo il traffico di rete e rallenta processo di compilazione. costruire-helper-Maven-plugin aiuta solo con un artefatto, volevo soluzione in grado di eliminare tutti gli artefatti datati istantanee timestamp dalla cache locale con un semplice comando. Dopo alcuni giorni di ricerche, ho rinunciato e deciso di scrivere piccolo programma. Il programma definitivo sembra funzionare abbastanza bene nel nostro ambiente. Così ho deciso di condividere con gli altri che potrebbero avere bisogno di questi strumenti. Le fonti possono essere estratti da github: https://github.com/nadestin/tools/tree/ master / MavenCacheCleanup
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")