150 votes

Pourquoi Maven télécharge-t-il à chaque fois le fichier maven-metadata.xml ?

Voici l'erreur que j'obtiens généralement lorsque ma connexion Internet est défaillante et que j'essaie de construire une application Web avec maven.

Ma question est la suivante : pourquoi maven doit-il toujours télécharger chaque fois que la même application a été construite auparavant ?

Qu'est-ce qui pourrait être faux dans ma configuration qui fait que maven télécharge à chaque fois ?

Voici l'erreur que je reçois lorsque j'essaie de construire hors ligne :

[INFO] ------------------------------------------------------------------------
[INFO] Building mywebapp 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: https://raw.github.com/pagecrumb/mungo/mvn-repo/com/pagecrumb/mungo/0.0.1-SNAPSHOT/maven-metadata.xml

[WARNING] Could not transfer metadata com.mywebapp:mungo:0.0.1-SNAPSHOT/maven-metadata.xml 
from/to mungo-mvn-repo (https://raw.github.com/pagecrumb/mungo/mvn-repo/): raw.github.com
[INFO] 
[INFO] --- maven-war-plugin:2.1.1:war (default-cli) @ mywebapp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp] in [D:\workspace\web\target\mywebapp-1.0-SNAPSHOT]
[INFO] Processing war project
[INFO] Copying webapp resources [D:\workspace\web\src\main\webapp]
[INFO] Webapp assembled in [1237 msecs]
[INFO] Building war: D:\workspace\web\target\mywebapp-1.0-SNAPSHOT.war
[WARNING] Warning: selected war files include a WEB-INF/web.xml which will be ignored 
(webxml attribute is missing from war task, 
or ignoreWebxml attribute is specified as 'true')
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building com.mywebapp [com.mywebapp] 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
Downloading: http://repo.maven.apache.org/maven2/org/apache/maven/plugins/maven-release-plugin/2.1/maven-release-plugin-2.1.pom

[WARNING] Failed to retrieve plugin descriptor for org.apache.maven.plugins:maven-release-plugin:2.1: Plugin org.apache.maven.plugins:maven-release-plugin:2.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-release-plugin:jar:2.1
Downloading: http://download.java.net/maven/2/org/apache/maven/plugins/maven-metadata.xml
Downloading: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml

397/397 B   

Downloaded: http://download.java.net/maven/2/org/codehaus/mojo/maven-metadata.xml (397 B at 0.0 KB/sec)
[WARNING] Failure to transfer org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from http://download.java.net/maven/2 was cached in the local repository, resolution will not be reattempted until the update interval of maven2-repository.dev.java.net has elapsed or updates are forced. Original error: Could not transfer metadata org.apache.maven.plugins:maven-war-plugin/maven-metadata.xml from/to maven2-repository.dev.java.net (http://download.java.net/maven/2): download.java.net
[INFO] 
[INFO] --- maven-war-plugin:2.3:war (default-cli) @ mywebapp-build ---
[INFO] Packaging webapp
[INFO] Assembling webapp [mywebapp-build] in [D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT]
[INFO] Processing war project
[INFO] Webapp assembled in [15 msecs]
[INFO] Building war: D:\workspace\target\mywebapp-build-0.0.1-SNAPSHOT.war
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] mywebapp ..................................... SUCCESS [27.999s]
[INFO] com.mywebapp [com.mywebapp] ..................... FAILURE [1:00.406s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:41.409s
[INFO] Finished at: Tue May 07 22:13:38 SGT 2013
[INFO] Final Memory: 11M/28M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.3:war 
(default-cli) on project mywebapp-build: Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)

160voto

user944849 Points 4138

Regardez dans votre settings.xml (ou, éventuellement, le POM parent de votre projet ou de votre société mère) pour le fichier <repositories> élément. Il ressemblera à ce qui suit.

<repositories>
    <repository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </releases>
    </repository>
</repositories>

Notez le <updatePolicy> élément. L'exemple indique à Maven de contacter le repo distant (Nexus dans mon cas, Maven Central si vous n'utilisez pas votre propre repo distant) chaque fois que Maven doit récupérer un artefact instantané pendant une construction, en vérifiant s'il existe une copie plus récente. Les métadonnées sont nécessaires pour cela. S'il existe une copie plus récente, Maven la télécharge dans votre repo local.

Dans l'exemple, pour les communiqués, la politique est la suivante daily afin qu'il soit vérifié lors de votre première construction de la journée. never est également une option valable, comme décrit dans Documentation sur les paramètres Maven .

Les plugins sont résolus séparément. Vous pouvez avoir des dépôts configurés pour ceux-ci également, avec des politiques de mise à jour différentes si vous le souhaitez.

<pluginRepositories>
    <pluginRepository>
        <id>central</id>
        <url>http://gotoNexus</url>
        <snapshots>
            <enabled>true</enabled>
            <updatePolicy>daily</updatePolicy>
        </snapshots>
        <releases>
            <enabled>true</enabled>
            <updatePolicy>never</updatePolicy>
        </releases>
    </pluginRepository>
</pluginRepositories>

Quelqu'un d'autre a mentionné le -o option. Si vous utilisez cette option, Maven fonctionne en mode "hors ligne". Il sait qu'il n'a qu'un repo local et il ne contactera pas le repo distant pour rafraîchir les artefacts, quelles que soient les politiques de mise à jour que vous utilisez.

43voto

jfc Points 512

Il est possible d'utiliser le drapeau -o,--offline "Work offline" pour empêcher cela.

Comme ça :

maven compile -o

15voto

Gab Points 1979

Je suppose que c'est parce que vous n'avez pas spécifié la version du plugin et que cela déclenche le téléchargement des métadonnées associées afin d'obtenir la dernière version.

Sinon, avez-vous essayé de forcer l'utilisation du repo local en utilisant -o ?

0voto

Puce Points 13540

Je n'ai pas encore étudié quand Maven fait quelle recherche, mais pour obtenir des constructions stables et reproductibles, je recommande fortement de ne pas accéder directement aux dépôts Maven mais d'utiliser un gestionnaire de dépôts Maven tel que Nexus.

Voici le tutoriel pour configurer votre fichier de paramètres :

http://books.sonatype.com/nexus-book/reference/maven-sect-single-group.html

http://maven.apache.org/repository-management.html

0voto

Tomask Points 1030

Maven fait cela parce que votre dépendance est dans une version SNAPSHOT et maven n'a aucun moyen de détecter les changements apportés à cette version snapshot dans le dépôt. Libérez votre artefact et changez la version dans pom.xml pour cette version et maven ne récupérera plus le fichier de métadonnées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X