Maven non riesce a trovare artefatto locale


107

Di tanto in tanto Maven si lamenta del fatto che una particolare dipendenza, che è costruita e impacchettata localmente, non può essere trovata nel repository locale durante la costruzione di un altro progetto che la ha come dipendenza. Otteniamo un errore del tipo:

Impossibile eseguire l'obiettivo sul progetto X: Impossibile risolvere le dipendenze per il progetto X: Impossibile trovare Y in [repository archiva] memorizzato nella cache nel repository locale, la risoluzione non verrà ritentata fino a quando l'intervallo di aggiornamento dell'interno non sarà trascorso o gli aggiornamenti non saranno forzati - >

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

Abbiamo provato vari profili in settings.xml e ovviamente "mvn -U". Né fare nulla di buono, né dovrebbero perché questo artefatto non va mai oltre il deposito locale.

Le uniche due cose che sembrano funzionare sono aspettare molto tempo prima che Maven si riprenda, o eliminare completamente il repository locale. Presumibilmente l'opzione di attesa è relativa al suddetto intervallo di aggiornamento.

Abbiamo riscontrato questo problema con Maven 3.0.2 e 3.0.3. Stiamo usando Archiva 1.0.3 (ma ancora una volta questo non dovrebbe essere un fattore). Qualsiasi aiuto sarebbe molto apprezzato.


1
Maven sta registrando qualcosa mentre o appena prima dell '"attesa?" Cioè sta tentando di connettersi a un repository non raggiungibile? Inoltre, gli artefatti problematici sono "-SNAPSHOT"?
noahlz

Maven non registra nient'altro che l'errore che ho menzionato sopra. E sì, questa è una dipendenza istantanea.
user1686620


1
Hai installato il pacchetto di build prima di provare a creare il secondo progetto?
khmarbaise

3
Mi piace come il messaggio di errore sia un run-on, non una frase grammaticalmente corretta. In questo modo, non sappiamo con certezza se non riesce a trovare Y o se Y è stato memorizzato nella cache locale, o entrambi. Comunque, ho un problema simile. Sono stato in grado di risolverlo con l'opzione -U perché le mie dipendenze sono nel repository interno della mia azienda. Perché gli artefatti di cui hai bisogno non vengono distribuiti nel repository interno della tua azienda?
jyoungdev

Risposte:


77

Il repository Maven locale tiene traccia della provenienza degli artefatti dall'utilizzo di un file denominato "_maven.repository" nella directory degli artefatti. Dopo averlo rimosso, la build ha funzionato. Questa risposta ha risolto il problema per me.


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

2
Grazie al file denominato _remote.repositories era presente anche. è successo a me quando il nostro nexus smette di avere una connessione di rete quindi non può ottenere le dipendenze
cabaji99

1
La soluzione fornita funziona. Tuttavia, mi interessa sapere perché si verifica questo problema. Qualcuno potrebbe fornirmi una rapida spiegazione? Devo fare qualcosa di diverso?
Janothan

Se vuoi bypassare questo controllo dell'origine una volta (senza eliminare i metafile), prova a passare aether.enhancedLocalRepository.trackingFilename=some_dummy_file_nameal processo di risoluzione delle dipendenze; Il modo più semplice è aggiungere una proprietà di sistema -D al comando di invocazione.
Janaka Bandara

@Janothan IMO il link nella risposta fornisce una spiegazione abbastanza buona :)
Janaka Bandara

40

Poiché le opzioni qui non hanno funzionato per me, condivido come l'ho risolto:

Il mio progetto ha un progetto padre (con il proprio pom.xml) che ha molti moduli figli, uno dei quali (A) ha una dipendenza da un altro figlio (B). Quando ho provato mvn packagein A, non ha funzionato perché B non poteva essere risolto.

L'esecuzione mvn install nella directory principale ha fatto il lavoro. Dopodiché, potrei fare mvn packageall'interno di A e solo allora potrebbe trovare B.


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

18

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

Il semplice comando della shell di seguito elimina questi file marker. Questo è sicuro se utilizzi solo la modalità offline per la macchina. NON lo farei su una macchina che ha bisogno di estrarre file dal web.

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

Su Linux / Unix puoi eliminare i file marker del repository remoto in questo modo:

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

1
Questa soluzione ha funzionato per me, per una dipendenza che ho copiato da un altro computer che non è disponibile in un repository centrale. Il comando però manca alcuni caratteri. Ecco il comando completo: trova. -name "_remote.repositories" -type -f -delete
Hans Deragon

2
Oppure, invece di eliminare, dovresti essere in grado di "fuorviare" Maven per non guardare il _remote.repositoriesfile passando -Daether.enhancedLocalRepository.trackingFilename=some_dummy_file_nameal processo. (Non ho provato una build Maven reale, ma funziona quando si richiama Maven a livello di programmazione; quindi anche il primo dovrebbe funzionare)
Janaka Bandara

1
Ho fatto questo trovando ed eliminando dipendenze specifiche (jars) non trovate da Maven, poiché erano elencate e gestibili da a (<10). Ciò era dovuto a un errore di configurazione che puntava a un Nexus remoto non attualmente disponibile (come ho capito ..). Quindi non è necessario eseguire lo sweep di tutti i repo per la cancellazione. Comunque questa soluzione ha salvato la giornata. Per me funziona.
Diego1974

9

Quando è successo a me, è stato perché avevo copiato ciecamente il mio settings.xml da un modello e aveva ancora l' <localRepository/>elemento vuoto . Ciò significa che non è presente alcun repository locale utilizzato per la risoluzione delle dipendenze (sebbene gli artefatti installati vengano comunque inseriti nella posizione predefinita). Quando l'ho sostituito con <localRepository>${user.home}\.m2\repository</localRepository>esso ha iniziato a funzionare.

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


6
$ {user.home} \. m2 \ repository è l'impostazione predefinita, quindi rimuovere il tag vuoto dovrebbe funzionare allo stesso modo.
Luis Muñoz

9

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

La soluzione rapida è eliminare la sottodirectory "repository" locale per l'artefatto del problema, supponendo che tu abbia risolto il problema con esso. :)

mvn -U forzerà l'aggiornamento dal repository remoto, di nuovo, supponendo che tu abbia popolato il remoto con detto artefatto.


2

Cattura tutto. Quando le soluzioni menzionate qui non funzionano (è successo nel mio caso), elimina semplicemente tutti i contenuti dalla cartella / directory ".m2" e fallo mvn clean install.


2

Se hai <repositories/>definito nel tuo pom.xml apparentemente il tuo repository locale viene ignorato.


1

Anche io ho affrontato questo problema e l'ho risolto in 2 modi:

1) Nel tuo IDE seleziona il progetto e pulisci tutti i progetti, quindi installa tutte le dipendenze di Maven facendo clic con il pulsante destro del mouse su progetto -> vai a Maven e Aggiorna le dipendenze del progetto seleziona tutti i progetti contemporaneamente per installare lo stesso. Fatto ciò, esegui il progetto specifico

2) Altrimenti, che si può fare è il check-nella pom.xml per le dipendenze per i quali si stanno ottenendo l'errore e "mvn clean install" coloro dipendente primo progetto e le dipendenze installa Maven del progetto attuale in cui di fronte a voi problema. In questo modo verranno create le dipendenze del progetto locale e verranno creati i jar.


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, eliminando il file .lastupdate o l'intera directory e scaricando di nuovo, ma non ha funzionato. infine, ho cancellato la directory e l'ho installato di nuovo in locale, funziona.


0

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


0

Avevo DependencyResolutionExceptionin Ubuntu Linux quando ho installato artefatti locali tramite uno script di shell. La soluzione era eliminare gli artefatti locali e installarli di nuovo "manualmente", chiamando mvn install:install-filetramite terminale.


0

Questo è successo perché al httpposto di httpsquesto avevo :

<repository>
    <id>jcenter</id>
    <name>jcenter-bintray</name>
    <url>https://jcenter.bintray.com</url>
</repository>

0

controlla se il tuo artefatto Y ha il packaging impostato su "jar". Se è stato definito come "war" per errore o copia incolla, verrà visualizzato questo strano "è stato memorizzato nella cache nel repository locale, la risoluzione non verrà ritentata fino a quando l'intervallo di aggiornamento interno non sarà trascorso o gli aggiornamenti non saranno forzati". Mi aspetterei qualcosa del tipo "artefatto Y è guerra, atteso tipo di vaso".


-1

Ho avuto lo stesso errore per una causa diversa: avevo creato un POM iniziale contenente le nostre dipendenze di "buona pratica" e l'ho costruito e installato localmente per testarlo. Potrei "vederlo" nel repo, ma un progetto che lo ha utilizzato ha ottenuto l'errore di cui sopra. Quello che avevo fatto era impostare il POM iniziale su pom, quindi non c'era JAR. Maven aveva ragione sul fatto che non fosse in Nexus, ma non mi aspettavo che lo fosse, quindi l'errore è stato, ummm, inutile. La modifica del POM di avviamento nella confezione normale e la reinstallazione hanno risolto il problema.


Questa risposta sarebbe stata probabilmente migliore come commento, poiché non è una risposta diretta alla domanda.
00prometheus
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.