Warum lädt Maven jedes Mal die Datei maven-metadata.xml herunter?

116

Unten ist der Fehler aufgeführt, den ich normalerweise bekomme, wenn meine Internetverbindung beim Versuch, eine Webanwendung mit maven zu erstellen, flankiert.

Meine Frage ist, warum Maven immer jedes Mal herunterladen muss, wenn dieselbe App früher erstellt wurde.

Was könnte an meiner Konfiguration falsch sein, die Maven jedes Mal zum Herunterladen bringt?

Unten ist ein Fehler, den ich bekomme, wenn ich versuche, offline zu erstellen:

[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)
Quarks
quelle
2
Der Zugriff auf Metadaten im Falle von SNAPSHOTs ist erforderlich, um Maven über neu erstellte SNAPSHOTs usw. zu informieren
khmarbaise
7
Ich weiß nicht , warum , aber Sie können dies vermeiden , indem Option -o wie mitmvn clean install -o
ant
Tatsächlich ist der Fehler, bei dem der Build fehlschlägt, "Fehler beim Zusammenstellen des WAR: webxml-Attributs erforderlich (oder bereits vorhandenes WEB-INF / web.xml, wenn es im Aktualisierungsmodus ausgeführt wird)". Also sollten Sie das beheben. Ich kann mir nicht vorstellen, dass es mit Ihrer Internetverbindung zusammenhängt. Die Warnungen zur Abhängigkeitsauflösung sind genau das: Warnungen. Sie sind nicht die ultimative Ursache für Ihren Build-Fehler.
Frans
Vielleicht können Sie Ihre Frage klären, da Sie anscheinend zwei Fragen haben: 1) Warum schlägt mein Build fehl? 2) Warum versucht Maven, Metadaten herunterzuladen? Die Antwort von user944849 reicht weit zur Beantwortung von 2). Wenn dies Ihre Frage beantwortet, sollten Sie sie akzeptieren.
Frans
Schnappschuss-Metadaten-Update kann vermieden werden mit -nsu, --no-snapshot-updatesOption mitmvn
Janaka Bandara

Antworten:

127

Suchen Sie in Ihrem settings.xml(oder möglicherweise dem übergeordneten oder übergeordneten POM Ihres Projekts) nach dem <repositories>Element. Es wird ungefähr so ​​aussehen wie unten.

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

Beachten Sie das <updatePolicy>Element. In diesem Beispiel wird Maven angewiesen, sich jederzeit an das Remote-Repo zu wenden (in meinem Fall an Nexus, Maven Central, wenn Sie kein eigenes Remote-Repo verwenden). Maven muss während eines Builds ein Snapshot-Artefakt abrufen und prüfen, ob eine neuere Kopie vorhanden ist. Hierzu werden die Metadaten benötigt. Wenn es eine neuere Kopie gibt, lädt Maven sie auf Ihr lokales Repo herunter.

In diesem Beispiel gilt für Releases die Richtlinie dailyso, dass sie bei Ihrem ersten Build des Tages überprüft wird. neverist auch eine gültige Option, wie in den Maven-Einstellungsdokumenten beschrieben .

Plugins werden separat aufgelöst. Möglicherweise sind auch für diese Repositorys konfiguriert, ggf. mit unterschiedlichen Aktualisierungsrichtlinien.

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

Jemand anderes erwähnte die -oOption. Wenn Sie das verwenden, wird Maven im "Offline" -Modus ausgeführt. Es weiß, dass es nur ein lokales Repo hat, und es wird das Remote-Repo nicht kontaktieren, um die Artefakte zu aktualisieren, unabhängig davon, welche Update-Richtlinien Sie verwenden.

user944849
quelle
2
Die Frage ist: Warum ist es nicht immer "nie" (was ich denke, dass es sein sollte)? Warum müssen Sie täglich oder immer aktualisiert werden?
Leon
@Leon Während des Entwicklungszyklus hat Ihr Projekt möglicherweise '-SNAPSHOT'-Abhängigkeiten, für die Sie möglicherweise immer die neueste Version auswählen möchten - zumindest auf einem CI-System, das Sie wahrscheinlich hätten, hat ein Entwickler möglicherweise andere Vorlieben - die Stabilität des Handels mit Builds gegen die neuesten Änderungen. Was die Maven-Dokumente (charakteristischerweise leider) nicht klarstellen, sind die Standardwerte für diese, wenn nichts festgelegt ist.
Ed Randall
1
Die beste Vorgehensweise ist, dass sich ein Artefakt nach der Veröffentlichung nie ändert, sodass <updatePolicy> nie </ updatePolicy> für sie geeignet sein sollte.
Ed Randall
Was aber, wenn Sie Ihre POM-Abhängigkeiten auf eine neue Version aktualisieren? Wird es niemals aktualisiert?
Philip Rego
1
@PhilipRego - Die updatePolicy gilt pro Artefakt. Wenn Sie eine Versionsnummer oder eine Gruppen- / Artefakt-ID ändern, ist dies ein anderes Artefakt. Wenn die updatePolicy "nie" lautet, wird das Artefakt einmal heruntergeladen, es sei denn, die Aktualisierung wird erzwungen -Uoder das Artefakt wird aus dem lokalen Repo entfernt und muss daher erneut heruntergeladen werden.
user944849
31

Es ist möglicherweise möglich, das Flag -o,--offline "Work offline"zu verwenden, um dies zu verhindern.

So was:

maven compile -o

jfc
quelle
Ich glaube, dies sollte die richtige Antwort sein, da Sie diesen Befehl einfach aufrufen können, wenn Ihre Internetverbindung flankiert. Und das war es, was gefragt wurde ...
Also
13

Ich nehme an, weil Sie keine Plugin-Version angegeben haben, sodass der Download der zugehörigen Metadaten ausgelöst wird, um die letzte zu erhalten.

Haben Sie ansonsten versucht, die lokale Repo-Nutzung mit -o zu erzwingen?

Gab
quelle
Wie spezifizierst du die Plugin-Version? Ich bin sicher, ich habe die Version im POM eingestellt ... können Sie genauer sein?
Quarks
Nun, wenn Sie ein versionElement in dem pluginElement haben, dann haben Sie es tatsächlich konfiguriert, wenn ja, habe ich keine Ideen mehr ... Viel Glück
Gab
In meinem Fall war die Version ein Bereich [12.1 12.2] und der Metadaten-Cache wurde auf 24 Stunden eingestellt, damit beim ersten Build jeden Tag nach einer neueren Version
gesucht wird
Was ist mit Standard-Plugins? wie maven-surefire-common, was ich nicht angegeben habe?
Yegeniy
Ihre Version ist für eine bestimmte Maven-Version festgelegt, aber Sie können eine andere Version mit pluginManagementAbschnitt erzwingen
Gab
0

Ich habe noch nicht studiert, wann Maven welche Suche durchführt, aber um stabile und reproduzierbare Builds zu erhalten, empfehle ich dringend, nicht direkt auf Maven Respositories zuzugreifen, sondern einen Maven Repository Manager wie Nexus zu verwenden.

Hier ist das Tutorial zum Einrichten Ihrer Einstellungsdatei:

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

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

Puce
quelle
@acdcjunior wie gesagt, das habe ich noch nicht studiert. Die Verwendung eines lokalen Maven Repository Managers löst jedoch auch die meisten dieser Probleme (wenn Maven nach Metadaten sucht, greift er nur auf Ihren Maven Repository Manager zu)
Puce
1
Meiner Meinung nach ist ein Repo-Manager nur innerhalb einer Organisation nützlich, um redundanten Download zu vermeiden und insbesondere Artefakte bereitzustellen, die für diese Organisation spezifisch sind (wie übergeordnete Poms und interne Module). Warum sollten Sie sonst einen zusätzlichen Spiegel hinzufügen, da Sie bereits den lokalen haben?
Gab
@Puce Ich sehe nicht, wie das das Problem lösen würde. Wenn Sie nicht möchten, dass Maven im gesamten Netzwerk nach Metadaten sucht, spielt es keine Rolle, ob diese über das Internet oder den Intranet-Repo-Manager überprüft werden.
Eis
@eis sollte es helfen, wenn die "Internetverbindung flankiert" ist oder wenn einer der Repository-Server derzeit nicht verfügbar ist, da Sie nur auf den Maven-Repository-Manager in Ihrem LAN zugreifen.
Puce
@Gap Während Repo-Manager aus den von Ihnen genannten Gründen in einer Organisation besonders nützlich sind, ist ein Repo-Manager auch wichtig, um stabile und reproduzierbare Builds zu erhalten. Dies ist etwas, das ich normalerweise anstrebe, selbst wenn ich derzeit der einzige Entwickler im Projekt bin. Es stellt sicher, dass ich mein lokales Repo löschen und trotzdem alle Builds reproduzieren kann und dass andere Entwickler problemlos dem Projekt beitreten können. Ich versichere dies mit Jenkins, der manchmal auch lokal ausgeführt wird, auch auf den Repo-Manager zugreift und dabei hilft, meine Projekte freizugeben -> 2 Benutzer, die auf den Repo-Manager zugreifen: Jenkins und ich
Puce
0

Maven tut dies, weil sich Ihre Abhängigkeit in einer SNAPSHOT-Version befindet und Maven keine Möglichkeit hat, Änderungen an dieser Snapshot-Version im Repository zu erkennen. Geben Sie Ihr Artefakt frei und ändern Sie die Version in pom.xml in diese Version. Maven ruft die Metadatendatei nicht mehr ab.

Maskieren
quelle