¿Cómo obligo a Maven a usar mi repositorio local en lugar de ir a repositorios remotos para recuperar artefactos?

97

Estoy usando Maven 3.3.3 con Java 8 en Mac Yosemite. Tengo un proyecto de varios módulos.

    <modules>
            <module>first-module</module>
            <module>my-module</module></modules>

Cuando construyo uno de mis módulos secundarios, por ejemplo, "my-module" desde arriba, usando "mvn clean install", la construcción intenta descargar los artefactos del módulo secundario desde un repositorio remoto que he definido en mi ~ / .m2 Archivo /settings.xml. La salida está debajo

[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.9 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151104.200545-4.pom

¿Cómo obligo a Maven a verificar mi repositorio ~ / .m2 / local antes de intentar descargar desde los repositorios remotos? A continuación es donde tengo mis repositorios remotos definidos en mi archivo ~ / .m2 / settings.xml ...

<profile>
    <id>releases</id>
    <activation>
        <property>
            <name>!releases.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>releases</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>
<profile>
    <id>snapshots</id>
    <activation>
        <property>
            <name>!snapshots.off</name>
        </property>
    </activation>
    <repositories>
        <repository>
            <id>snapshots</id>
            <url>https://my.remoterepository.com/nexus/content/repositories/snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>
</profile>

Editar: en respuesta a la respuesta que dice que la descarga se produce cuando el artefacto no está allí, a continuación se muestra la salida del terminal en la que pruebo que el archivo estaba allí en mi repositorio, pero Maven está tratando de descargarlo de todos modos ...

Daves-MacBook-Pro-2:my-module davea$ ls -al ~/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar 
-rw-r--r--  1 davea  staff  10171 Nov  5 10:22 /Users/davea/.m2/repository/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-SNAPSHOT.jar
Daves-MacBook-Pro-2:my-module davea$ mvn clean install
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for org.mainco.subco:my-module:jar:87.0.0-SNAPSHOT
[WARNING] 'build.plugins.plugin.(groupId:artifactId)' must be unique but found duplicate declaration of plugin org.apache.maven.plugins:maven-antrun-plugin @ org.mainco.subco:my-module:[unknown-version], /Users/davea/Documents/sb_workspace/my-module/pom.xml, line 678, column 12
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building my-module 87.0.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/maven-metadata.xml (788 B at 0.8 KB/sec)
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-module-87.0.0-20151106.043202-8.pom
Downloaded: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/first-module/87.0.0-SNAPSHOT/first-   module-87.0.0-20151106.043202-8.pom (3 KB at 21.9 KB/sec)
Downloading: http://download.java.net/maven/2/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Downloading: https://my.remoterepository.com/nexus/content/repositories/snapshots/org/mainco/subco/subco/87.0.0-SNAPSHOT/maven-metadata.xml
Dave
fuente
2
Maven hace comprobar su repositorio local antes de intentar descargar un artefacto de un repositorio remoto. ¿Estás seguro de que tu local tenía estos artefactos antes de intentar esta compilación? Puede inspeccionar su repositorio local ahora e intentar otra compilación de todos modos. Además, puede especificar dónde está su repositorio local en settings.xml(ver aquí ).
mystarrocks
Aunque no he especificado mi repositorio en mi archivo settings.xml, es el predeterminado que Maven configuró para mí: ~ / .m2 / repository. ¿Tengo que especificarlo incluso cuando es el predeterminado?
Dave
Para mí, hay otros archivos en mis repositorios locales, como * .sha1 o * .lastUpdate. eliminar otros archivos excepto * .jar y * .pom evitará que maven vuelva a descargar el archivo desde el repositorio remoto
Harun

Respuestas:

45

La dependencia tiene una versión instantánea. Para las instantáneas, Maven verificará el repositorio local y si el artefacto encontrado en el repositorio local es demasiado antiguo, intentará encontrar uno actualizado en los repositorios remotos. Eso es probablemente lo que estás viendo.

Tenga en cuenta que este comportamiento está controlado por la updatePolicydirectiva en la configuración del repositorio (que es dailypor defecto para los repositorios de instantáneas).

Andreas Veithen
fuente
16
¿Es posible "sobrescribir" esto mediante el argumento del comando de la consola? Me gusta: mvn clean install -FORCE_COMMAND
Naxos84
21
"Demasiado viejo", ¿qué significa? Selecciona la instantánea más reciente que pueda encontrar, ya sea local o remota. Seguramente ese sería un comportamiento horrible. Si acabo de crear una instantánea, realmente quiero usar esa, no la que la compilación de CI ha creado un momento después.
Tom Quarendon
Explique más acerca de lo que significa "Demasiado viejo".
Đỗ Công Bằng
32

Utilice mvn --helpy podrá ver la lista de opciones.

Hay una opción como -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

Entonces use command mvn install -nsupuede forzar la compilación con el repositorio local.

Zheng Zhongqi
fuente
10
También se puede utilizar -opara el comportamiento experto "sin conexión"
Sean
8
La opción -nsu no evita que mvn intente y no pueda descargar un artefacto de forma remota si aún no se ha descargado en lugar de usar la compilación local como cuando el artefacto se compiló e instaló localmente. -
user1767316
Tuve el mismo problema con un artefacto que aún no se había descargado y esto lo solucionó: maven.apache.org/general.html#importing-jars
Luigi Cristalli
15

Para forzar realmente a maven a usar solo su repositorio local, puede ejecutar con mvn <goals> -o. El -ole dice a Maven que le permita trabajar "sin conexión" y permanecerá fuera de la red.

Sean
fuente
5
La opción -o no evita que mvn intente y no pueda descargar un artefacto de forma remota si aún no se ha descargado en lugar de usar la compilación local como cuando el artefacto se compiló e instaló localmente.
usuario1767316
2
eso es cierto: si no tiene una copia local, no tendrá suerte. Esto es útil para proyectos que ha creado antes, pero que potencialmente tienen cambios SNAPSHOT recientes que no le interesan.
Sean
O incluso si nunca construyó el proyecto, podría prepararse para que se construya fuera de línea conmvn dependency:go-offline
Aldian
¿Qué sucede si tiene una copia local que acaba de instalar (por lo que nunca se implementa / está disponible en el repositorio de instantáneas remoto)?
Vivek Chavda
1
Ah, acabo de crear un proyecto pom con una colección de dependencias, pero no especifiqué <type> pom </type> en el proyecto consumidor, por lo que estaba buscando un frasco (y por supuesto no podía encontrarlo, incluso en modo fuera de línea)
Vivek Chavda
4

En mi caso tuve un proyecto de varios módulos como tú. Tuve que cambiar un ID de grupo de una de las bibliotecas externas de las que dependía mi proyecto, como se muestra a continuación.

De:

<dependencyManagement>
    <dependency>
        <groupId>org.thirdparty</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

A:

<dependencyManagement>
   <dependency>
      <groupId>org.thirdparty.module</groupId>
        <artifactId>calculation-api</artifactId>
        <version>2.0</version>
        <type>jar</type>
        <scope>provided</scope>
    </dependency>
<dependencyManagement>

Preste atención a la sección <groupId>. Resultó que me estaba olvidando de modificar la sección correspondiente de los submódulos que definen esta dependencia en sus archivos pom.

Me volvió loco porque el módulo estaba disponible localmente.

Willa
fuente
4

Siga los pasos a continuación:

    1. Asegúrese de eliminar todo el contenido de la carpeta jar ubicada en su local excepto el jar que desea conservar.
      Por ejemplo, archivos como .repositories, .pom, .sha1, .lastUpdated, etc.
    1. Ejecutar mvn clean install -ocomando

Esto ayudará a utilizar archivos jar del repositorio local en lugar de conectarse a cualquier repositorio.

Madhu
fuente
1
Eliminar solo archivos *.repositoriesy *.sha1me
funcionó
2

La opción -o no funcionó para mí porque el artefacto todavía está en desarrollo y aún no se ha cargado y maven (3.5.x) todavía intenta descargarlo del repositorio remoto porque es la primera vez, según el error que recibo.

Sin embargo, esto lo arregló para mí: https://maven.apache.org/general.html#importing-jars

Después de esta instalación manual, tampoco es necesario utilizar la opción sin conexión.

ACTUALIZAR

Acabo de reconstruir la dependencia y tuve que volver a importarla: lo normal mvn clean installno era suficiente para mí

Luigi Cristalli
fuente
-1

Maven siempre verifica primero su repositorio local, sin embargo, su dependencia debe estar instalada en su repositorio para que Maven la encuentre.

Ejecute mvn installprimero su módulo de dependencia y luego cree su módulo dependiente.

Oliver
fuente
1
He editado mi pregunta para mostrar que el artefacto está en el repositorio (observe el comando "ls -al" que ejecuto. Sin embargo, Maven está intentando descargarlo de todos modos. ¿Alguna otra idea?
Dave
5
@Oliver: se está perdiendo el hecho de que para los artefactos en el repositorio local, Maven aún puede consultar los repositorios remotos si el artefacto es una instantánea demasiado antigua.
Andreas Veithen