Como faço para que o Maven pare de tentar verificar se há atualizações de artefatos de um determinado grupo do maven-central-repo?

126

Estou trabalhando em um projeto bastante grande do Maven. Provavelmente, temos cerca de 70 artefatos individuais, que são divididos em duas bibliotecas de código compartilhado e talvez dez aplicativos que os utilizam. Todos esses itens estão no espaço para nome com.mycompany.*.

Na maioria das vezes, estamos executando versões de snapshot. Para fazer uma compilação completa de um aplicativo, primeiro devo compilar os projetos da biblioteca para que sejam instalados no meu repositório local (como, por exemplo, mycompany-libname-2.4-SNAPSHOT.jar).

O problema é que quando eu vou construir os aplicativos. Por alguma razão, o Maven deseja verificar os dois principais repositórios públicos (maven-net-repo e java-net-repo) para obter atualizações para todos osmycompany-*-SNAPSHOT.jar artefatos. Obviamente, eles não são encontrados lá e tudo acaba voltando às versões que eu acabei de construir no meu repositório local, mas eu gostaria que o Maven parasse de fazer isso porque (a) isso me faz sentir como uma rede ruim. por verificar constantemente esses repositórios em busca de coisas que nunca estarão lá, e (b) adiciona alguma latência de rede desnecessária e irritante ao meu processo de criação.

Passei a executar o maven no modo offline na maioria das vezes para contornar isso, mas isso não é ideal, pois ocasionalmente uma dependência de uma biblioteca pública será atualizada. Então, o que estou procurando é uma solução que faça com que o Maven não verifique se há atualizações de repositórios específicos para artefatos que atendem a certos critérios - nesse caso, ficaria feliz se o Maven ignorasse as versões do INSTANTÂNEO ou os artefatos que estavam em o com.mycompanyespaço para nome.

Tim Gilbert
fonte

Respostas:

34

A tag updatePolicy não funcionou para mim. No entanto, o Rich Seller mencionou que os snapshots deveriam ser desativados de qualquer maneira, então eu olhei mais e notei que o repositório extra que eu adicionei ao meu settings.xml estava causando o problema. Adicionar a seção de capturas instantâneas a este repositório no meu settings.xml fez o truque!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>
Dennis Lassing
fonte
Muito obrigado pela resposta. Isso finalmente me ajudou. Eu estava tendo alguns problemas com downloads de instantâneos para um dos repositórios. Os downloads estavam suspensos, mesmo com a atualização policial nunca. Agora, os snapshots não são baixados, exatamente o que eu queria.
wolfroma
163

Além disso, você pode usar -oou --offlinena linha de comando mvn que colocará o maven no "modo offline" para que não verifique se há atualizações. Você receberá um aviso sobre não conseguir dependências que ainda não estão no seu repositório local, mas não é grande coisa.

Jeff Tsay
fonte
8
Isso impedirá que o maven baixe as dependências liberadas também. Você pode querer uma versão mais recente de biblioteca liberada, sem snapshots sendo verificado para atualização
hobgoblin
2
CLARAMENTE não é uma resposta para a pergunta original! Como ele pode ter tantos votos positivos ??? O OP escreveu explicitamente que ele tentou executar o maven no modo offline, mas não é o ideal para o seu propósito!
Honza Zidek
95

Algo que agora também está disponível no maven é

mvn goal --no-snapshot-updates

ou em suma

mvn goal -nsu
joostschouten
fonte
3
Apenas no caso de alguém do SBT chegar aqui: set offline := truena sessão ou offline := trueem build.sbt.
opyate 13/10/12
5
Além disso, a nsuopção está quebrada na v 3.0.3 (consulte MNG-5064 ). Para usar esta opção de maneira confiável, pode ser necessário atualizar para pelo menos a v. 3.0.4 ou v. 3.0.5
Ashutosh Jindal 27/03
muito melhor
AntJavaDev
32

Atualização: Eu provavelmente deveria ter começado com isso, pois seus projetos são INSTANTÂNEOS. Faz parte da semântica do SNAPSHOT que o Maven verificará atualizações em cada compilação. Ser um INSTANTÂNEO significa que é volátil e está sujeito a alterações, portanto, as atualizações devem ser verificadas. No entanto, vale ressaltar que o super POM do Maven configura a central para ter os snapshots desativados; portanto, o Maven nunca deve procurar atualizações para SNAPSHOTs na central, a menos que você tenha substituído isso em suas próprias configurações / pom.


Você pode configurar o Maven para usar um espelho no repositório central. Isso redirecionará todas as solicitações que normalmente iriam para o repositório interno.

Em seu settings.xml, você adicionaria algo assim para definir seu repositório interno como espelho da central:

<mirrors>
  <mirror>
    <id>ibiblio.org</id>
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
    <url>http://path/to/my/repository</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

Se você estiver usando um gerenciador de repositório como o Nexus para seu repositório interno. Você pode configurar um repositório de proxy para a central de proxy, para que todas as solicitações que normalmente iriam para a Central sejam enviadas para seu repositório de proxy (ou um grupo de repositórios que contenha o proxy) e as solicitações subsequentes sejam armazenadas em cache no gerenciador de repositório interno. Você pode até definir o tempo limite do cache do proxy como -1, para que ele nunca solicite conteúdo da central que já esteja no repositório do proxy.


Uma solução mais básica se você estiver trabalhando apenas com repositórios locais é definir " updatePolicy" para o repositório central como "nunca", isso significa que o Maven só verificará artefatos que ainda não estão no repositório local. Isso pode ser substituído na linha de comando quando necessário, usando a opção -U para forçar o Maven a verificar se há atualizações.

Você configuraria o repositório (no seu pom ou em um perfil no settings.xml) da seguinte maneira:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
Vendedor rico
fonte
Na verdade, já temos um repositório central, mas é claro que não publicamos compilações de snapshots, então, presumivelmente, eu ainda teria falhas nas verificações de atualização com o proxy / espelho no lugar - estou procurando uma maneira de obter o Maven para não verificar se há atualizações para esses artefatos.
Tim Gilbert
1
Também vale a pena configurar um repositório lógico no seu repositório central para os seus INSTANTÂNEOS. Isso significa que eles podem ser compartilhados entre seus desenvolvedores e você nem precisa construí-los todos localmente. Você obterá todos os benefícios dos SNAPSHOTs, escolhendo as alterações nas dependências do SNAPSHOT assim que elas forem enviadas para o repositório remoto.
Rich Seller
Obrigado - o sinalizador updatePolicy parece exatamente o que eu estava procurando.
Tim Gilbert
1
O Nexus também permite configurar regras para impedir que solicitações de artefatos da empresa sejam externos.
Brian Fox
O fragmento XML aqui está desatualizado. O updatePolicyelemento fica sob o elemento snapshotsou releases. Veja: maven.apache.org/settings.html
Jeff Evans
5

Muito simples :

No pai do Super POM ou setting.xml, use

        <repository>
        <id>central</id>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <updatePolicy>never</updatePolicy>
        </snapshots>
        <url>http://repo1.maven.org/maven2</url>
        <layout>legacy</layout>
    </repository>

São minhas dicas

Bruno Régnier
fonte
0

Eu tive alguns problemas semelhantes a isso,

<repository>
    <id>java.net</id>
    <url>https://maven-repository.dev.java.net/nonav/repository</url>
    <layout>legacy</layout>
</repository>
<repository>
    <id>java.net2</id>
    <url>https://maven2-repository.dev.java.net/nonav/repository</url>
</repository>

Definir o updatePolicy como "never" não funcionou. A remoção desses repositórios foi a maneira que resolvi. ps: Eu estava seguindo este tutorial sobre serviços web (btw, provavelmente o melhor tutorial para ws para java)

terceiro
fonte
1
Você está usando o Intellij? Porque Intellij + Maven = ignora updatePolicy. Veja o relatório de erro youtrack.jetbrains.com/issue/IDEA-76869
Manav