¿Cómo puedo hacer que Maven deje de intentar buscar actualizaciones de artefactos de un determinado grupo de maven-central-repo?

126

Estoy trabajando en un proyecto Maven bastante grande. Probablemente tenemos alrededor de 70 artefactos individuales, que se dividen aproximadamente en dos bibliotecas de código compartido y tal vez diez aplicaciones que los usan. Todos estos elementos viven en el espacio de nombres com.mycompany.*.

La mayoría de las veces corremos contra compilaciones de instantáneas. Entonces, para hacer una compilación completa de una aplicación, primero podría compilar los proyectos de la biblioteca para que se instalen en mi repositorio local (como, por ejemplo mycompany-libname-2.4-SNAPSHOT.jar).

El problema es que cuando voy a construir las aplicaciones. Por alguna razón, Maven quiere verificar los dos principales repositorios públicos (maven-net-repo y java-net-repo) para ver las actualizaciones de todos los mycompany-*-SNAPSHOT.jarartefactos. Por supuesto, no se encuentran allí, y todo finalmente se resuelve a las versiones que acabo de construir en mi repositorio local, pero me gustaría que Maven dejara de hacerlo porque (a) me hace sentir como un mal ciudadano neto. por revisar constantemente estos repositorios en busca de cosas que nunca estarán allí, y (b) agrega latencia de red innecesaria y molesta a mi proceso de compilación.

La mayoría de las veces he estado ejecutando Maven en modo fuera de línea para solucionar este problema, pero eso no es ideal ya que ocasionalmente se actualizará una dependencia de una biblioteca pública. Entonces, lo que estoy buscando es una solución que haga que Maven no busque actualizaciones de los repositorios dados para artefactos que cumplan con ciertos criterios; en este caso, estaría feliz si Maven ignorara las versiones SNAPSHOT o los artefactos que estaban en El com.mycompanyespacio de nombres.

Tim Gilbert
fuente

Respuestas:

34

La etiqueta updatePolicy no funcionó para mí. Sin embargo, Rich Seller mencionó que las instantáneas deberían deshabilitarse de todos modos, así que busqué más y noté que el repositorio adicional que agregué a settings.xml estaba causando el problema en realidad. ¡Agregar la sección de instantáneas a este repositorio en mi settings.xml hizo el truco!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>
Dennis Lassing
fuente
Muchas gracias por la respuesta. Finalmente me ayudó. Estaba experimentando algunos problemas con las descargas de instantáneas para uno de los repositorios. Las descargas se bloquearon incluso con la actualización de la policía nunca. Ahora las instantáneas no se descargan, que es exactamente lo que quería.
wolfroma
163

Además, puede usar -oo --offlineen la línea de comando mvn que pondrá a maven en "modo fuera de línea" para que no busque actualizaciones. Recibirá algunas advertencias sobre no poder obtener dependencias que aún no están en su repositorio local, pero no es gran cosa.

Jeff Tsay
fuente
8
Esto evitará que Maven descargue las dependencias liberadas también. Es posible que desee una versión más nueva de la biblioteca lanzada, sin que se verifiquen las instantáneas para su actualización
hobgoblin
2
¡Esto claramente NO es una respuesta a la pregunta original! ¿Cómo puede tener tantos votos a favor? El OP escribió explícitamente que intentó ejecutar maven en modo fuera de línea, ¡pero no es ideal para su propósito!
Honza Zidek
95

Algo que ahora también está disponible en Maven es

mvn goal --no-snapshot-updates

o en resumen

mvn goal -nsu
joostschouten
fuente
3
Por si acaso alguien de SBT aterriza aquí: set offline := trueen la sesión o offline := trueen build.sbt.
Opiato
55
Además, la nsuopción está rota en v 3.0.3 (Ver MNG-5064 ). Para usar esta opción de manera confiable, es posible que deba actualizar a al menos v. 3.0.4 o v. 3.0.5
Ashutosh Jindal el
bastante mejor
AntJavaDev
32

Actualización: Probablemente debería haber comenzado con esto ya que sus proyectos son INSTANTÁNEOS. Es parte de la semántica SNAPSHOT que Maven buscará actualizaciones en cada compilación. Ser SNAPSHOT significa que es volátil y está sujeto a cambios, por lo que se deben verificar las actualizaciones. Sin embargo, vale la pena señalar que el super POM de Maven configura central para tener las instantáneas deshabilitadas, por lo que Maven nunca debería buscar actualizaciones para SNAPSHOT en central a menos que haya anulado eso en su propio pom / configuración.


Puede configurar Maven para usar un espejo para el repositorio central, esto redirigirá todas las solicitudes que normalmente irían a la central a su repositorio interno.

En su settings.xml agregaría algo como esto para configurar su repositorio interno como espejo para 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>

Si está utilizando un administrador de repositorio como Nexus para su repositorio interno. Puede configurar un repositorio de proxy para proxy central, de modo que las solicitudes que normalmente irían a Central se envían a su repositorio de proxy (o un grupo de repositorio que contiene el proxy), y las solicitudes posteriores se almacenan en caché en el administrador de repositorio interno. Incluso puede establecer el tiempo de espera de la caché del proxy en -1, por lo que nunca solicitará contenido de la central que ya está en el repositorio del proxy.


Una solución más básica si solo está trabajando con repositorios locales es establecer updatePolicy para el repositorio central en "nunca", esto significa que Maven solo buscará artefactos que aún no estén en el repositorio local. Esto puede anularse en la línea de comando cuando sea necesario utilizando el interruptor -U para forzar a Maven a buscar actualizaciones.

Configuraría el repositorio (en su pom o un perfil en settings.xml) de la siguiente manera:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
Vendedor rico
fuente
De hecho, ya tenemos un repositorio central, pero, por supuesto, no publicamos compilaciones de instantáneas en él, por lo que presumiblemente aún obtendría verificaciones de actualizaciones fallidas con el proxy / espejo en su lugar: estoy buscando una forma de obtener Maven no buscar actualizaciones para estos artefactos.
Tim Gilbert el
1
También vale la pena configurar un repositorio lógico en su repositorio central para sus INSTANTÁNEAS. Esto significa que se pueden compartir entre sus desarrolladores y no todos tienen que construirlos localmente. Entonces obtendrá el beneficio completo de SNAPSHOTs al recoger los cambios en cualquier dependencia de SNAPSHOT tan pronto como se envíen al repositorio remoto.
Vendedor rico
Gracias: el indicador updatePolicy se parece exactamente a lo que estaba buscando.
Tim Gilbert el
1
Nexus también le permite configurar reglas para evitar que cualquier solicitud de artefactos de la empresa se vuelva externa.
Brian Fox el
El fragmento XML aquí ahora está desactualizado. El updatePolicyelemento va debajo del elemento snapshotso releases. Ver: maven.apache.org/settings.html
Jeff Evans
5

Muy simple :

En su Super POM parent o 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>

Son mis consejos

Bruno Régnier
fuente
0

Tuve algunos problemas similares a este,

<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>

Establecer updatePolicy en "nunca" no funcionó. Eliminar estos repositorios fue la forma en que lo resolví. ps: estaba siguiendo este tutorial sobre servicios web (por cierto, probablemente el mejor tutorial para ws para java)

tercero
fuente
1
¿Estás usando Intellij? Porque Intellij + Maven = ignorar updatePolicy. Ver informe de error youtrack.jetbrains.com/issue/IDEA-76869
Manav