web-dev-qa-db-fra.com

Comment forcer Maven à utiliser mon référentiel local plutôt que de se rendre dans des dépôts distants pour récupérer des artefacts?

J'utilise Maven 3.3.3 avec Java 8 sur Mac Yosemite. J'ai un projet multi-module.

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

Lorsque je construis l'un de mes modules enfants, par exemple, "mon-module" à partir de ci-dessus, à l'aide de "mvn clean install", la construction tente de télécharger les artefacts de module enfant à partir d'un référentiel distant que j'ai défini dans mon ~/.m2. fichier /settings.xml. La sortie est en dessous

[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

Comment forcer Maven à vérifier d’abord mon répertoire local ~/.m2/avant d’essayer de télécharger à partir des référentiels distants? Vous trouverez ci-dessous la liste des référentiels distants définis dans mon fichier ~/.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>

Modifier: En réponse à la réponse indiquant que le téléchargement se produit lorsque l'artefact n'est pas là, vous trouverez ci-dessous la sortie du terminal dans laquelle je prouve que le fichier se trouvait dans mon référentiel, mais que Maven essaie de le télécharger quand même ...

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

La dépendance a une version d'instantané. Pour les instantanés, Maven vérifiera le référentiel local. Si l'artefact trouvé dans le référentiel local est trop ancien, il tentera de trouver un artefact mis à jour dans les référentiels distants. C'est probablement ce que vous voyez.

Notez que ce comportement est contrôlé par la directive updatePolicy dans la configuration du référentiel (par défaut, daily par défaut pour les référentiels d'instantanés).

33
Andreas Veithen

Utilisez mvn --help et vous pouvez voir la liste des options.

Il y a une option comme -nsu,--no-snapshot-updates Suppress SNAPSHOT updates

Donc, utilisez la commande mvn install -nsu peut forcer la compilation avec le référentiel local.

21
Zheng Zhongqi

Pour vraiment forcer maven to seulement utiliser votre référentiel local, vous pouvez exécuter avec mvn <goals> -o. Le -o indique à Maven de vous permettre de travailler "hors ligne" et restera en dehors du réseau.

5
Sean

Dans mon cas, j'ai eu un projet multi-modules comme vous. Je devais changer l'ID de groupe d'une des bibliothèques externes sur lesquelles mon projet dépendait, comme indiqué ci-dessous.

De:

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

À:

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

Faites attention à la section <groupId>. Il s’est avéré que j’avais oublié de modifier la section correspondante des sous-modules qui définissent cette dépendance dans leurs fichiers pom.

Cela me rendait très fou parce que le module était disponible localement.

3
Willa

L'option -o n'a pas fonctionné pour moi car l'artefact est en cours de développement, n'a pas encore été téléchargé et maven (3.5.x) tente toujours de le télécharger à partir du référentiel distant car c'est la première fois, selon l'erreur que j'ai reçue.

Cependant, cela a résolu le problème pour moi: https://maven.Apache.org/general.html#importing-jars

Après cette installation manuelle, il n'est plus nécessaire d'utiliser l'option hors ligne.

UPDATE

Je viens de reconstruire la dépendance et je devais la réimporter: le mvn clean install normal ne me suffisait pas

2
Luigi Cristalli

Suivez les étapes ci-dessous:
1.N'oubliez pas de supprimer tout le contenu du dossier jar situé dans votre répertoire local, à l'exception du fichier jar que vous souhaitez conserver.
Par exemple, des fichiers tels que .repositories, .pom, .sha1, .lastUpdated etc.

2.Exécuter mvn clean install -o commande

Cela vous aidera à utiliser les fichiers JAR du référentiel local plutôt que de vous connecter à un référentiel.

0
Madhu