2012-09-20 39 views
44

Occasionalmente Maven si lamenta che una particolare dipendenza, che è costruita e confezionata localmente, non può essere trovata nel repository locale mentre si costruisce un altro progetto che lo ha come dipendenza. Otteniamo un errore come:Maven non riesce a trovare artefatto locale

Impossibile eseguire obiettivo sul progetto X: Impossibile risolvere le dipendenze per progetto X: La mancata per trovare Y in [repository Archiva] è stata memorizzata nella cache nel repository locale, la risoluzione non verrà effettuato un tentativo fino l'intervallo di aggiornamento interno è scaduto o gli aggiornamenti sono forzati ->

Dove X è il progetto in costruzione e Y è l'artefatto presumibilmente mancante. Se si guarda nel repository locale, l'artefatto è lì. Questo artefatto non è mai installato nel nostro archivio di Archiva, quindi il problema si basa esclusivamente sul repository locale.

Abbiamo provato vari profili in settings.xml e, naturalmente, "mvn -U". Né fare del bene, né dovrebbero perché questo artefatto non va mai oltre il repository locale.

Le uniche due cose che sembrano funzionare sono aspettare molto tempo prima che maven si svegli o eliminare completamente il repository locale. Presumibilmente l'opzione di attesa è correlata all'intervallo di aggiornamento di cui sopra.

Abbiamo riscontrato questo problema con maven 3.0.2 e 3.0.3. Usiamo Archiva 1.0.3 (ma anche questo non dovrebbe essere un fattore). Qualsiasi aiuto sarebbe molto apprezzato.

+1

È Maven accedendo nulla mentre o poco prima del "aspettando?" Cioè sta tentando di connettersi a un repository irraggiungibile? Inoltre, ci sono gli artefatti problematici "-SNAPSHOT"? – noahlz

+0

Maven non registra altro che l'errore che ho menzionato sopra. E sì questa è una dipendenza da snapshot. – user1686620

+0

Vedere http://stackoverflow.com/questions/1348603/how-can-i-get-maven-to-stop-attempting-to-check-for-up-ates-for-artifacts-from-a – noahlz

risposta

5

Quando mi è successo, era perché avevo copiato in modo cieco il mio settings.xml da un modello e aveva ancora l'elemento vuoto. Ciò significa che non ci sono repository locali usati quando si risolvono le dipendenze (anche se le risorse installate vengono ancora inserite nella posizione predefinita). Quando l'ho sostituito con <localRepository>${user.home}\.m2\repository</localRepository> ha iniziato a funzionare.

Per * nix, sarebbe <localRepository>${user.home}/.m2/repository</localRepository>, suppongo.

+4

$ {user.home} \. M2 \ repository è l'impostazione predefinita, quindi la rimozione del tag vuoto dovrebbe funzionare allo stesso modo. –

30

Il repository Maven locale rileva le origini degli artefatti utilizzando un file denominato "_maven.repositories" nella directory degli artefatti. Dopo averlo rimosso, la build ha funzionato. This answer risolto il problema per me.

+0

Ha funzionato per me, grazie! – janhink

+6

Per me era un file chiamato "_remote.repositories". L'ho rimosso e ha funzionato! Grazie per i trucchi! – perbellinio

+0

Thx anche il file chiamato _remote.repositories. è successo a me quando il nostro nesso smette di avere una connessione di rete quindi non può ottenere le dipendenze – cabaji99

5

Maven ricorda quando non ha trovato qualcosa. La chiave è "la risoluzione non verrà ritestata fino a quando non è trascorso l'intervallo di aggiornamento interno o gli aggiornamenti sono forzati ->"

La soluzione rapida è eliminare la sottodirectory locale "repository" per l'artefatto problema, presupponendo che sia stato risolto il problema. problema con esso. :)

mvn -U impone l'aggiornamento dal repository remoto - di nuovo, assumendo che tu abbia ora popolato il remoto con detto artefatto.

0

Corro al problema simile quando il mio nuovo progetto dipende da oracle jdbc jar (che ho installato nel mio repository locale e funziona bene per altri progetti). Ho provato l'opzione -U, cancellando il file .lastupdate o l'intera directory e di nuovo downlaod, ma non ha funzionato. infine, ho cancellato la directory e l'ho installata di nuovo localmente, funziona.

0

Uno degli errori che ho trovato intorno a Maven è quando ho inserito il mio file settings.xml nella directory sbagliata. Deve essere nella cartella .m2 sotto la directory home dell'utente. Assicurati che sia nel posto giusto (insieme a settings-security.xml se lo stai usando).

0

Avevo DependencyResolutionException in Ubuntu Linux quando ho installato artefatti locali tramite uno script di shell. La soluzione era eliminare le risorse locali e installarle di nuovo "manualmente", chiamando il mvn install:install-file tramite terminale.

-2

Si prega di provare questo comando.

mvn validate

7

Come le opzioni qui non ha funzionato per me, sto condividendo come ho risolto:

ho il mio progetto, c'è un progetto principale (con una propria pom.xml) questo ha molti moduli figli, uno dei quali (A) ha una dipendenza da un altro bambino (B). Quando ho provato mvn package in A, non ha funzionato perché B non può essere risolto.

Esecuzione mvn installnella directory superiore ha svolto il lavoro. Dopo di che, potrei fare mvn package all'interno di A e solo dopo trovò B.

+0

wow - questo è davvero pessimo *** per me. Un progetto padre ha moduli molto grandi che * non * dipendono dai (piccoli) moduli di cui ho bisogno su un dispositivo incorporato. Upvoting per * info * ("non sparare al messenger" ..) – javadba

+0

GRAZIE! questo mi stava facendo impazzire pacchetto mvn clean jboss-as: deploy funzionava quando eseguivo su una singola riga, ma non quando li facevo separatamente. – PMorganCA

3

Anche in modalità offline, Maven controllerà i repository remoti se c'è un indicatore _remote.repositories per la dipendenza. Se è necessario operare in modalità offline, potrebbe essere necessario eliminare questi file.

Di seguito è disponibile un semplice comando shell per eliminare questi file marker. Questo è sicuro da fare se si utilizza solo la modalità offline per la macchina. NON lo farei su una macchina che deve estrarre file dal web.

Ho usato questa strategia su un server di build disconnesso dal web. Dobbiamo trasferire il repository su di esso, eliminare i file marker e quindi eseguire in modalità offline.

Su Linux/Unix è possibile eliminare i file marcatore repository remoto in questo modo:

cd ~/.m2 
find -name "_remote.repositories" type -f -delete 
Problemi correlati