Maven não consegue encontrar artefato local

107

Ocasionalmente, o maven reclama que uma dependência específica, que é construída e empacotada localmente, não pode ser encontrada no repositório local durante a construção de outro projeto que a tenha como dependência. Recebemos um erro como:

Falha ao executar a meta no projeto X: Não foi possível resolver dependências para o projeto X: Falha ao encontrar Y em [repositório archiva] foi armazenado em cache no repositório local, a resolução não será tentada novamente até que o intervalo de atualização de interno tenha decorrido ou as atualizações sejam forçadas - >

Onde X é o projeto sendo construído e Y é o artefato supostamente ausente. Se você olhar no repositório local, o artefato está lá. Este artefato nunca é instalado em nosso repositório archiva, então o problema é puramente baseado no repositório local.

Tentamos vários perfis em settings.xml e, claro, "mvn -U". Não fazem bem, nem deveriam, porque este artefato nunca vai além do repositório local.

As únicas duas coisas que parecem funcionar são esperar muito tempo até que o maven se torne mais inteligente ou deletar completamente o repositório local. Presumivelmente, a opção de espera está relacionada ao intervalo de atualização mencionado.

Tivemos esse problema com o maven 3.0.2 e 3.0.3. Estamos usando o Archiva 1.0.3 (mas, novamente, isso não deve ser um fator). Qualquer ajuda seria muito apreciada.

user1686620
fonte
1
O Maven está registrando algo antes ou antes da "espera?" Ou seja, ele está tentando se conectar a um repositório inacessível? Além disso, os artefatos problemáticos são "-SNAPSHOT"?
noahlz
O Maven não registra nada além do erro que mencionei acima. E sim, esta é uma dependência de instantâneo.
user1686620
1
Você instalou o pacote de compilação antes de tentar compilar o segundo projeto?
khmarbaise
3
Eu gosto de como a mensagem de erro é um run-on, não uma frase gramaticalmente correta. Dessa forma, não sabemos ao certo se ele não consegue encontrar Y ou se Y foi armazenado em cache localmente, ou ambos. Enfim, tenho um problema semelhante. Consegui resolver isso com a opção -U porque minhas dependências estão no repo interno da minha empresa. Por que os artefatos de que você precisa não estão implantados no repositório interno da sua empresa?
jyoungdev

Respostas:

77

O repositório Maven local rastreia de onde os artefatos vieram originalmente usando um arquivo denominado "_maven.repositories" no diretório de artefatos. Depois de removê-lo, a construção funcionou. Essa resposta resolveu o problema para mim.

Jhanson
fonte
26
Para mim, era um arquivo chamado "_remote.repositories". Eu removi e funcionou! Obrigado pelos truques!
perbellinio
2
Thx o arquivo chamado _remote.repositories também estava presente. aconteceu comigo quando nosso nexo parou de ter conexão de rede e não conseguiu obter as dependências
cabaji99
1
A solução fornecida funciona. No entanto, estou interessado em saber por que esse problema ocorre. Alguém poderia me fornecer uma explicação rápida? Eu tenho que fazer algo diferente?
Janothan
Se você quiser ignorar essa verificação de origem uma vez (sem excluir os metarquivos), tente passar aether.enhancedLocalRepository.trackingFilename=some_dummy_file_namepara o processo de resolução de dependência; A maneira mais fácil é adicionar uma propriedade de sistema -D ao comando de chamada.
Janaka Bandara
@Janothan IMO o link na resposta fornece uma explicação muito boa :)
Janaka Bandara
40

Como as opções aqui não funcionaram para mim, estou compartilhando como resolvi isso:

Meu projeto tem um projeto pai (com seu próprio pom.xml) que tem muitos módulos filhos, um dos quais (A) tem dependência de outro filho (B). Quando tentei mvn packageem A, não funcionou porque B não pôde ser resolvido.

Executar mvn install no diretório pai funcionou. Depois disso, eu poderia fazer mvn packagedentro de A e só então poderia encontrar B.

Florian Pfisterer
fonte
3
OBRIGADO! Isso estava me deixando louco. mvn clean package jboss-as: deploy estava funcionando quando executei em uma única linha, mas não quando os fiz separadamente.
PMorganCA
18

Mesmo no modo offline, o maven verificará os repositórios remotos se houver um marcador _remote.repositories para a dependência. Se precisar operar no modo off-line, pode ser necessário excluir esses arquivos.

O comando shell simples abaixo exclui esses arquivos marcadores. É seguro fazer isso se você usar o modo off-line para a máquina. Eu NÃO faria isso em uma máquina que precisa puxar arquivos da web.

Usei essa estratégia em um servidor de compilação que está desconectado da web. Temos que transferir o repositório para ele, deletar os arquivos do marcador e então executar no modo offline.

No Linux / Unix, você pode excluir os arquivos marcadores do repositório remoto desta forma:

cd ~/.m2
find . -name "_remote.repositories" -type f -delete
Jon
fonte
1
Esta solução funcionou para mim, para uma dependência que copiei de outro computador que não está disponível em um repositório central. O comando, entretanto, perde alguns caracteres. Aqui está o comando completo: find. -name "_remote.repositories" -type -f -delete
Hans Deragon
2
Ou, em vez de excluir, você deve ser capaz de "desviar" o Maven para não olhar o _remote.repositoriesarquivo passando -Daether.enhancedLocalRepository.trackingFilename=some_dummy_file_namepara o processo. (Não tentei uma compilação real do Maven, mas funciona ao invocar o Maven programaticamente; portanto, o anterior também deve funcionar)
Janaka Bandara
1
Fiz isso localizando e excluindo dependências específicas (jars) não encontradas pelo Maven, uma vez que elas foram listadas e gerenciáveis ​​para (<10). Isso ocorreu devido a um erro de configuração apontando para um Nexus remoto não disponível no momento (como eu entendi ..). Portanto, não há necessidade real de varrer todo o repo para exclusão. De qualquer forma, essa solução salvou o dia. Funciona para mim.
Diego1974
9

Quando isso aconteceu comigo, foi porque eu copiei cegamente meu settings.xml de um modelo e ele ainda tinha o <localRepository/>elemento em branco . Isso significa que não há repositório local usado ao resolver dependências (embora seus artefatos instalados ainda sejam colocados no local padrão). Quando o substituí por <localRepository>${user.home}\.m2\repository</localRepository>ele começou a funcionar.

Para * nix, isso seria <localRepository>${user.home}/.m2/repository</localRepository>, suponho.

Paul Hicks
fonte
6
$ {user.home} \. m2 \ repository é o padrão, portanto, remover a tag vazia deve funcionar da mesma forma.
Luis Muñoz,
9

Maven lembra quando não encontrou algo. A chave é "a resolução não será tentada novamente até que o intervalo de atualização de interno tenha decorrido ou as atualizações sejam forçadas ->"

A solução rápida é excluir o subdiretório "repositório" local do artefato com problema - assumindo que você tenha corrigido o problema com ele. :)

mvn -U irá forçar a atualização do repositório remoto - novamente, assumindo que você já tenha populado o remoto com o referido artefato.

Andre
fonte
2

Pegue tudo. Quando as soluções mencionadas aqui não funcionam (aconteceu no meu caso), simplesmente exclua todo o conteúdo da pasta / diretório '.m2' e faça mvn clean install.

lupchiazoem
fonte
2

Se você <repositories/>definiu em seu pom.xml, aparentemente, seu repositório local será ignorado.

Jaroslav Záruba
fonte
1

Até eu enfrentei esse problema e resolvi de 2 maneiras:

1) Em seu IDE, selecione o projeto e limpe todos os projetos e, em seguida, instale todas as dependências do maven clicando com o botão direito do mouse no projeto -> vá para maven e Atualizar as dependências do projeto selecione todos os projetos de uma vez para instalar os mesmos. Uma vez feito isso, execute o projeto específico

2) Outra coisa que você pode fazer é verificar no pom.xml as dependências para as quais você está obtendo o erro e "mvn clean install" primeiro para esses projetos dependentes e instalar as dependências do maven do projeto atual no qual você está enfrentando problemas. Com isso, as dependências do projeto local serão construídas e os jars serão criados.

Neha Tawar
fonte
0

Eu corro para o problema semelhante quando meu novo projeto depende do oracle jdbc jar (que instalei em meu repositório local e funciona bem para outros projetos). Tentei a opção -U, excluindo o arquivo .lastupdate ou todo o diretório e baixando novamente, mas não funcionou. finalmente, apaguei o diretório e instalei-o localmente novamente, ele funciona.

yuxh
fonte
0

Um dos erros que encontrei no Maven é quando coloco meu arquivo settings.xml no diretório errado. Ele deve estar na pasta .m2 no diretório inicial do usuário. Certifique-se de que está no lugar certo (junto com settings-security.xml se você estiver usando).

Ashik Uzzaman
fonte
0

Eu tinha DependencyResolutionExceptionno Ubuntu Linux quando instalei artefatos locais por meio de um script de shell. A solução foi deletar os artefatos locais e instalá-los novamente "manualmente" - chamando mvn install:install-filevia terminal.

naXa
fonte
0

Isso aconteceu porque eu tinha em httpvez httpsdisso:

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

verifique se o seu artefato Y tem a embalagem definida como "jar". Se você o definiu como "guerra" por erro ou copiar e colar, ele mostrará este estranho "foi armazenado em cache no repositório local, a resolução não será tentada novamente até que o intervalo de atualização de interno tenha decorrido ou as atualizações sejam forçadas". Eu esperaria algo como "artefato Y é guerra, é esperado o tipo jar".

Patrik Hrmo
fonte
-1

Eu tive o mesmo erro por uma causa diferente: criei um POM inicial contendo nossas dependências de "boas práticas" e o construí e instalei localmente para testá-lo. Eu poderia "ver" no repositório, mas um projeto que o utilizou obteve o erro acima. O que eu fiz foi definir o POM inicial para pom, então não havia JAR. Maven estava bastante correto ao dizer que não estava no Nexus - mas eu não esperava que estivesse, então o erro foi, hummm, inútil. Alterar o POM inicial para a embalagem normal e reinstalar corrigiu o problema.

EdmundSS
fonte
Essa resposta provavelmente teria sido melhor como um comentário, já que não é uma resposta direta à pergunta.
00prometheus