¿Cómo configuro Maven para el desarrollo sin conexión?

117

¿Maven requiere una conexión a Internet en algún momento para poder usarlo? ¿Significa específicamente obtener los complementos internos de maven para compilar, limpiar, empaquetar, etc.?


fuente
¿Tiene alguna máquina con acceso a Internet? ¿Quizás un servidor?
Marcelo
2
Lo hacemos, pero llevar las cosas desde allí al entorno de desarrollo es tedioso.

Respuestas:

163

Puede ejecutar maven en modo fuera de línea mvn -o install. Por supuesto, fallarán los artefactos que no estén disponibles en su repositorio local. Maven no se basa en repositorios distribuidos, pero ciertamente hacen que las cosas sean más fluidas. Es por esta razón que muchas tiendas usan espejos internos que se sincronizan gradualmente con los repositorios centrales.

Además, mvn dependency:go-offlinese puede utilizar para asegurarse de que tiene todas sus dependencias instaladas localmente antes de comenzar a trabajar sin conexión.

nsfyn55
fuente
En conjunción con esta respuesta, descubrí que mvn viene con sus complementos "principales" (es decir, compilador). Entonces, con mvn install puedo obtener lo que necesito.
8
También considere que puede usar "mvn dependency: go-offline" para asegurarse de que todas las dependencias a las que se hace referencia en su pom.xml estén presentes en su repositorio local.
Thorbjørn Ravn Andersen
10
Lamentablemente, mvn dependency:go-offlinesimplemente no atrapa todo. Dentro de una nueva máquina virtual, por ejemplo, mi proyecto aún debe descargar cosas incluso después de ejecutar este objetivo. Consulte también este número .
phs
2
Mi experiencia muestra que la opción -o no funciona correctamente y que el objetivo de desconectarse está lejos de ser suficiente para permitir una compilación sin conexión completa: vea la solución que encontré aquí: stackoverflow.com/q/43661755/1767316
user1767316
Si agrega el indicador -llr adicionalmente a -o, debería funcionar.
Udo
10

Si tiene una PC con acceso a Internet en su LAN, debe instalar un repositorio local de Maven.

Recomiendo Artifactory Open Source . Esto es lo que usamos en nuestra organización, es realmente fácil de configurar.

Artifactory actúa como un proxy entre su herramienta de construcción (Maven, Ant, Ivy, Gradle, etc.) y el mundo exterior.

Almacena en caché los artefactos remotos para que no tenga que descargarlos una y otra vez.

Bloquea las solicitudes externas no deseadas (y a veces sensibles a la seguridad) de artefactos internos y controla cómo y dónde se implementan los artefactos y por quién.

Después de configurar Artifactory, solo necesita cambiar Maven settings.xmlen las máquinas de desarrollo:

<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <mirrors>
    <mirror>
      <mirrorOf>*</mirrorOf>
      <name>repo</name>
      <url>http://maven.yourorganization.com:8081/artifactory/repo</url>
      <id>repo</id>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <repositories>
        <repository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>libs-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-release</url>
        </repository>
        <repository>
          <snapshots />
          <id>snapshots</id>
          <name>libs-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-snapshot</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>plugins-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-release</url>
        </pluginRepository>
        <pluginRepository>
          <snapshots />
          <id>snapshots</id>
          <name>plugins-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-snapshot</url>
        </pluginRepository>
      </pluginRepositories>
      <id>artifactory</id>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>artifactory</activeProfile>
  </activeProfiles>
</settings>

Usamos esta solución porque tuvimos problemas con el acceso a Internet en nuestras máquinas de desarrollo y algunos artefactos descargaron archivos corruptos o no se descargaron en absoluto. No hemos tenido problemas desde entonces.

Marcelo
fuente
No hay una máquina con acceso que esté conectada a la LAN.
2
Con artifactory puede hacer una copia de seguridad de todo su repositorio y luego restaurarlo en una de las PC que se encuentra en la LAN.
Marcelo
7

Tienes dos opciones para esto:

1.) realice cambios en settings.xml agregue esto en la primera etiqueta

<localRepository>C:/Users/admin/.m2/repository</localRepository>

2.) use la etiqueta -o para el comando fuera de línea.

mvn -o clean install -DskipTests=true
mvn -o jetty:run
Jyoti Prakash
fuente
6

Maven necesita las dependencias en su repositorio local. La forma más fácil de obtenerlos es con acceso a Internet (o más difícil usando otras soluciones proporcionadas aquí).

Entonces, asumiendo que puede obtener acceso a Internet temporalmente, puede prepararse para desconectarse utilizando el complemento maven-dependency-plugin con su dependencia: objetivo de desconexión . Esto descargará todas las dependencias de su proyecto en su repositorio local (por supuesto, los cambios en las dependencias / complementos requerirán un nuevo acceso a Internet / repositorio central).

FrVaBe
fuente
4

Lamentablemente, dependency:go-offlineno me ha funcionado, ya que no guardó todo en caché, es decir. Los archivos POM y otros implícitamente mencionan dependencias.

La solución ha sido especificar una ubicación de repositorio local , ya sea dentro del settings.xmlarchivo con <localRepository>...</localRepository>o ejecutándose mvncon el -Dmaven.repo.local=...parámetro. Después de la construcción inicial del proyecto, todos los artefactos necesarios deben almacenarse en caché, y luego puede hacer referencia a la ubicación del repositorio de la misma manera, mientras ejecuta la compilación de Maven en modo fuera de línea ( mvn -o ...).

luka5z
fuente
3

Antes de desconectarse, debe asegurarse de que todo esté en su repositorio local, lo cual es necesario para trabajar sin conexión. Ejecutar "mvn dependency: go-offline" para el (los) proyecto (s) / pom (s), en el que desea trabajar, reducirá los esfuerzos para lograrlo.

Pero generalmente no es toda la historia, porque la dependencia: go-offline solo descargará los complementos de "compilación básica" ( go-offline / resolve-plugins no resuelve todas las dependencias de los complementos ). Por lo tanto, debe encontrar una manera de descargar los complementos de implementación / prueba / sitio (y tal vez otros) y sus dependencias en su repositorio.

Además, dependency: go-offline no descarga el artefacto pom en sí, por lo que tienes que depender: cópialo si es necesario.

A veces, como escribió MaDa, no sabe lo que necesitará mientras está desconectado, lo que hace que sea bastante imposible tener un repositorio "suficiente".

De todos modos, al tener un repositorio correctamente llenado, solo tiene que agregar "<offline> true </offline>" al archivo settings.xml de Maven para desconectarse.

No cambie el perfil (id) de Maven que utilizó para completar su repositorio, mientras estaba desconectado. Maven reconoce los artefactos descargados en sus metadatos con una "identidad", que está vinculada a la identificación del perfil.

Eike Pögel
fuente
3

Si está utilizando IntelliJ, simplemente puede ir a Preferencias -> Compilación, ejecución, implementación -> Herramientas de compilación -> Maven y marcar / desmarcar Trabajar sin conexión .

heez
fuente
1
Del mismo modo, Eclipse es Ventana -> Preferencias -> Maven y marque "Sin conexión"
Stuart Brock
2

¿Esto funciona para tí?

http://jojovedder.blogspot.com/2009/04/running-maven-offline-using-local.html

No olvide agregarlo a su repositorio de complementos y apunte la URL a donde sea que esté su repositorio.

<repositories>
    <repository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </pluginRepository>
</pluginRepositories>

De lo contrario, es posible que deba ejecutar un servidor local, por ejemplo, apache, en sus máquinas.

gigadot
fuente
Eso parece ser más para dependencias y complementos como los complementos jetty, tomcat, etc. Estoy más preocupado por los complementos internos de Maven como maven-compiler-plugin
1
@predhme: este enfoque funcionará para todos los complementos, ya que todos estos van al repositorio de maven en su máquina local
JoseK
2


(fuente: jfrog.com )

o

Simplemente use los servidores de repositorio de Maven como Sonatype Nexus http://www.sonatype.org/nexus/ o JFrog Artifactory https://www.jfrog.com/artifactory/ .

Una vez que un desarrollador construye un proyecto, la compilación de los siguientes desarrolladores o Jenkins CI no requerirá acceso a Internet.

El servidor de repositorio de Maven también puede tener proxies configurados para acceder a Maven Central (o repositorios públicos más necesarios), y pueden tener una lista de artefactos en repositorios remotos.

Paul Verest
fuente
1

Mi experiencia muestra que la opción -o no funciona correctamente y que el objetivo de desconectarse está lejos de ser suficiente para permitir una compilación completa sin conexión:

La solución que pude validar incluye el uso de la --legacy-local-repositoryopción maven en lugar de la -o(sin conexión) y el uso del repositorio local en lugar del repositorio de distribución

Además, tuve que copiar todos los maven-metadata-maven2_central.xmlarchivos del repositorio local en la maven-metadata.xmlforma esperada por maven.

Vea la solución que encontré aquí .

usuario1767316
fuente
0

Responder a su pregunta directamente: no requiere una conexión a Internet, sino acceso a un repositorio, en LAN o disco local (use sugerencias de otras personas que publicaron aquí).

Si su proyecto no está en una fase madura, eso significa que cuando los POM se cambian con bastante frecuencia, el modo fuera de línea será muy poco práctico, ya que también tendrá que actualizar su repositorio con bastante frecuencia. A menos que pueda obtener una copia de un repositorio que tenga todo lo que necesita, pero ¿cómo lo sabría? Por lo general, inicia un repositorio desde cero y se clona gradualmente durante el desarrollo (en una computadora conectada a otro repositorio). Una copia del repositorio público repo1.maven.org pesa cientos de gigabytes, por lo que tampoco recomendaría la fuerza bruta.

MaDa
fuente
Lo es, pero no como un proyecto experto (hormiga). Así que tengo todas las bibliotecas que necesito, pero me preguntaba específicamente sobre las bibliotecas internas de maven. Como maven-plugin-compiler.
Si tiene todas las dependencias manejadas por Ant, probablemente carezca de metadatos de Maven de todos modos, por lo que Maven no las recogerá. En cuanto a las "bibliotecas internas de Maven", la única forma de descargarlas es construir su estructura pom y ejecutarla en una computadora conectada a Internet. Por "ejecutarlo" me refiero a ejecutar todos los objetivos que cree que utilizará, no necesariamente sólo "mvn clean install".
MaDa
0

En preparación antes de trabajar sin conexión, simplemente ejecute mvn dependency:go-offline

msangel
fuente
0

Apareció un nuevo complemento para corregir las deficiencias de mvn dependency:go-offline:

https://github.com/qaware/go-offline-maven-plugin

Agréguelo en su pom, luego ejecute mvn -T1C de.qaware.maven:go-offline-maven-plugin:resolve-dependencies. Una vez que haya configurado todas las dependencias dinámicas, maven no intentará descargar nada nuevamente (hasta que actualice las versiones).

Jiehong
fuente
-2
<offline> false </offline>

<localRepository>${user.home}/.m2/repository</localRepository>

a

<offline> true <offline>

<localRepository>${user.home}/.m2/repository</localRepository>

Cambie la etiqueta offline de falso a verdadero.

se descargará desde el repositorio en línea

dhanaraj k
fuente