2009-08-28 34 views
102

Estoy trabajando en un proyecto Maven bastante grande. Probablemente tenemos aproximadamente unos 70 artefactos individuales, que se dividen aproximadamente en dos bibliotecas de código compartido y quizás diez aplicaciones que las utilizan. Todos estos elementos viven en el espacio de nombres com.mycompany.*.¿Cómo puedo hacer que Maven deje de intentar buscar actualizaciones de artefactos de cierto grupo de maven-central-repo?

La mayoría de las veces nos estamos ejecutando 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 repositorios públicos principales (maven-net-repo y java-net-repo) para las actualizaciones de todos los artefactos mycompany-*-SNAPSHOT.jar. Por supuesto, no se encuentran allí, y finalmente todo se resuelve con las versiones que acabo de construir en mi repositorio local, pero me gustaría que Maven deje de hacerlo porque (a) me hace sentir como una mala net.citizen para comprobar constantemente estos repositorios de cosas que nunca estarán allí, y (b) agrega algo de latencia de red innecesaria y molesta en mi proceso de compilación.

He estado trabajando con maven en el modo fuera de línea la mayor parte del tiempo para evitar esto, pero eso no es ideal ya que ocasionalmente se actualizará una dependencia en una biblioteca pública. Entonces, lo que estoy buscando es una solución que hará que Maven no compruebe si hay actualizaciones de repositorios para artefactos que cumplan ciertos criterios; en este caso, me alegraría si Maven ignorara las versiones de SNAPSHOT o los artefactos que estaban en el espacio de nombre com.mycompany.

Respuesta

26

La etiqueta updatePolicy no funcionó para mí. Sin embargo Rich Seller mencionó que las instantáneas deberían desactivarse de todos modos, así que miré más a fondo y noté que el repositorio adicional que agregué a mi 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> 
+0

Muchas gracias por la respuesta. Finalmente me ayudó. Estaba experimentando algunos problemas con las descargas instantáneas de uno de los repositorios. Las descargas estaban pendientes, 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

29

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


Puede configurar Maven para utilizar un mirror para el repositorio central, esto va a redirigir todas las peticiones que normalmente pasarían al centro a su repositorio interno.

En su settings.xml deberá añadir algo como esto para establecer su repositorio internas como espejo para el centro:

<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á usando un administrador de repositorio como Nexus para su repositorio interno. Puede configurar proxy repository para proxy central, por lo que cualquier solicitud que normalmente vaya a Central se envía a su repositorio proxy (o a repository group que contiene el proxy), y las solicitudes posteriores se guardan en caché en el administrador de repositorio interno. Incluso puede configurar el tiempo de espera de caché del proxy en -1, por lo que nunca solicitará contenidos de la central que ya estén en el repositorio de proxy.


Una solución más básica si sólo se está trabajando con repositorios locales es establecer la updatePolicy para el repositorio central para "nunca", esto significa Maven solamente siempre comprobar si hay objetos que no están en el repositorio local. Esto puede ser anulado en la línea de comando cuando sea necesario usando el conmutador -U para forzar a Maven a buscar actualizaciones.

Debería configurar el repositorio (en su pom o un perfil en la configuración.xml) de la siguiente manera:

<repository> 
    <id>central</id> 
    <url>http://repo1.maven.org/maven2</url> 
    <updatePolicy>never</updatePolicy> 
</repository> 
+0

En realidad sí tienen un repositorio central ya, pero, por supuesto, no publicamos compilaciones de instantáneas en él, así que presumiblemente aún obtendría verificaciones de actualizaciones fallidas con el proxy/mirror en su lugar: estoy buscando una manera de hacer que Maven no compruebe si hay actualizaciones para estos artefactos. –

+1

También vale la pena configurar un repositorio lógico en su depósito central para sus SNAPSHOT. Esto significa que pueden ser compartidos entre sus desarrolladores y no todos tienen que compilarlos todos localmente. A continuación, obtendrá los beneficios completos de SNAPSHOTs al recoger los cambios en cualquier dependencia de SNAPSHOT tan pronto como sean enviados al repositorio remoto. –

+0

Gracias - el indicador updatePolicy parece exactamente lo que estaba buscando. –

135

Además, se puede utilizar -o o --offline en la línea de comandos mvn que pondrá experto en "modo offline" para que no se compruebe si hay actualizaciones. Recibirá una advertencia acerca de no poder obtener dependencias que ya no estén en su repositorio local, pero no es gran cosa.

+6

Esto evitará que maven descargue también las dependencias liberadas. Es posible que desee una versión más reciente de la biblioteca publicada, sin que se comprueben las instantáneas para la actualización – hobgoblin

+1

¡Claramente esto no es una respuesta a la pregunta original! ¿Cómo puede haber tantos upvotes? El OP explícitamente escribió que intentó ejecutar maven en modo fuera de línea, pero no es ideal para su propósito. –

0

tuve algunos problemas similares a esto,

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

Ajuste del updatePolicy a "nunca" no funcionó. La eliminación de estos repos fue la forma en que lo resolvió. PD: Estaba siguiendo este tutorial acerca de los servicios web (por cierto, probablemente el mejor tutorial para ws para Java)

+1

¿Estás usando Intellij? Porque Intellij + Maven = ignora updatePolicy. Consulte el informe de errores http://youtrack.jetbrains.com/issue/IDEA-76869 – Manav

75

Algo que ya está disponible en Maven, así es

mvn goal --no-snapshot-updates 

o en fin

mvn goal -nsu 
+2

Solo en caso de que alguien de SBT aterrice aquí: '' 'set offline: = true''' en la sesión, o' '' offline: = true''' en '' 'build.sbt'''. – opyate

+4

Además, la opción 'nsu' está rota en v 3.0.3 (Ver [** MNG-5064 **] (http://jira.codehaus.org/browse/MNG-5064)). Para usar esta opción de manera confiable, es posible que deba actualizar a atleast v. 3.0.4 o v. 3.0.5 –

4

muy simple:

en su matriz de Super POM o setting.xml, utilice

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

Es mis consejos

Cuestiones relacionadas