Wie kann ich Maven dazu bringen, nicht mehr nach Updates für Artefakte einer bestimmten Gruppe von maven-central-repo zu suchen?

126

Ich arbeite an einem ziemlich großen Maven-Projekt. Wir haben wahrscheinlich ungefähr 70 einzelne Artefakte, die grob in zwei Bibliotheken mit gemeinsam genutztem Code und möglicherweise zehn Anwendungen, die sie verwenden, aufgeteilt sind. Alle diese Elemente befinden sich im Namespace com.mycompany.*.

Die meiste Zeit laufen wir gegen Snapshot-Builds. Um eine vollständige Erstellung einer Anwendung durchzuführen, kann ich zunächst die Bibliotheksprojekte so erstellen, dass sie in meinem lokalen Repository installiert werden (z. B. mycompany-libname-2.4-SNAPSHOT.jar).

Das Problem ist, dass ich dann die Anwendungen erstelle. Aus irgendeinem Grund möchte Maven die beiden wichtigsten öffentlichen Repositorys (maven-net-repo und java-net-repo) auf Aktualisierungen für alle mycompany-*-SNAPSHOT.jarArtefakte überprüfen . Natürlich werden sie dort nicht gefunden und alles wird schließlich auf die Versionen zurückgeführt, die ich gerade in meinem lokalen Repository erstellt habe, aber ich möchte, dass Maven damit aufhört, weil (a) ich mich dadurch wie ein schlechter net.citizen fühle für die ständige Überprüfung dieser Repositorys auf Dinge, die niemals vorhanden sein werden, und (b) es fügt meinem Erstellungsprozess eine unnötige und lästige Netzwerklatenz hinzu.

Ich habe Maven die meiste Zeit im Offline-Modus ausgeführt, um dies zu umgehen, aber das ist nicht ideal, da gelegentlich eine Abhängigkeit von einer öffentlichen Bibliothek aktualisiert wird. Was ich also suche, ist eine Lösung, die dazu führt, dass Maven nicht nach Updates aus bestimmten Repositorys für Artefakte sucht, die bestimmte Kriterien erfüllen. In diesem Fall würde ich mich freuen, wenn Maven entweder SNAPSHOT-Versionen oder Artefakte, die sich darin befinden, ignorieren würde der com.mycompanyNamespace.

Tim Gilbert
quelle

Antworten:

34

Das updatePolicy-Tag hat bei mir nicht funktioniert. Rich Seller erwähnte jedoch, dass Snapshots sowieso deaktiviert werden sollten, also schaute ich weiter und bemerkte, dass das zusätzliche Repository, das ich meiner settings.xml hinzufügte, das Problem tatsächlich verursachte. Das Hinzufügen des Abschnitts "Snapshots" zu diesem Repository in meiner settings.xml hat den Trick getan!

<repository>
    <id>jboss</id>
    <name>JBoss Repository</name>
    <url>http://repository.jboss.com/maven2</url>
    <snapshots>
        <enabled>false</enabled>
    </snapshots>
</repository>
Dennis Lassing
quelle
Vielen Dank für die Antwort. Es hat mir letztendlich geholfen. Ich hatte einige Probleme mit Snapshot-Downloads für eines der Repositorys. Downloads hingen auch bei Update-Polizei nie. Jetzt werden keine Schnappschüsse heruntergeladen, was genau das ist, was ich wollte.
Wolfroma
163

Sie können auch -ooder --offlinein der mvn-Befehlszeile verwenden, wodurch maven in den "Offline-Modus" versetzt wird, sodass nicht nach Updates gesucht wird. Sie erhalten eine Warnung, dass Abhängigkeiten nicht bereits in Ihrem lokalen Repo abgerufen werden können, aber keine große Sache.

Jeff Tsay
quelle
8
Dadurch wird verhindert, dass maven auch freigegebene Abhängigkeiten herunterlädt. Möglicherweise möchten Sie eine neuere Version der freigegebenen Bibliothek, ohne dass Schnappschüsse auf Aktualisierung überprüft werden
hobgoblin
2
Dies ist eindeutig keine Antwort auf die ursprüngliche Frage! Wie kann es so viele positive Stimmen haben ??? Das OP schrieb ausdrücklich, dass er versucht habe, Maven im Offline-Modus auszuführen, aber es ist nicht ideal für seinen Zweck!
Honza Zidek
95

Etwas, das jetzt auch in Maven verfügbar ist, ist

mvn goal --no-snapshot-updates

oder kurz gesagt

mvn goal -nsu
Joostschouten
quelle
3
Nur für den Fall, dass SBT-Leute hier landen: set offline := truein der Sitzung oder offline := truein build.sbt.
Opyate
5
Außerdem ist die nsuOption in Version 3.0.3 nicht verfügbar (siehe MNG-5064 ). Um diese Option zuverlässig zu nutzen, müssen Sie möglicherweise ein Upgrade auf mindestens Version 3.0.4 oder Version 3.0.5
Ashutosh Jindal
ziemlich das Beste
AntJavaDev
32

Update: Ich hätte wahrscheinlich damit beginnen sollen, da Ihre Projekte SNAPSHOTs sind. Es ist Teil der SNAPSHOT-Semantik, dass Maven bei jedem Build nach Updates sucht. Ein SNAPSHOT zu sein bedeutet, dass er volatil ist und Änderungen unterworfen ist. Daher sollten Aktualisierungen überprüft werden. Es ist jedoch erwähnenswert, dass das Maven Super POM Central so konfiguriert, dass Snapshots deaktiviert sind. Daher sollte Maven niemals nach Updates für SNAPSHOTs in Central suchen, es sei denn, Sie haben dies in Ihren eigenen POM / Einstellungen überschrieben.


Sie können Maven so konfigurieren, dass ein Spiegel für das zentrale Repository verwendet wird. Dadurch werden alle Anforderungen, die normalerweise an das zentrale Repository gesendet werden, an Ihr internes Repository umgeleitet.

In Ihrer settings.xml würden Sie so etwas hinzufügen, um Ihr internes Repository als Spiegel für Central festzulegen:

<mirrors>
  <mirror>
    <id>ibiblio.org</id>
    <name>ibiblio Mirror of http://repo1.maven.org/maven2/</name>
    <url>http://path/to/my/repository</url>
    <mirrorOf>central</mirrorOf>
  </mirror>
</mirrors>

Wenn Sie einen Repository-Manager wie Nexus für Ihr internes Repository verwenden. Sie können ein Proxy-Repository für Proxy Central einrichten , sodass alle Anforderungen, die normalerweise an Central gesendet werden, stattdessen an Ihr Proxy-Repository (oder eine Repository-Gruppe, die den Proxy enthält) gesendet werden und nachfolgende Anforderungen im internen Repository-Manager zwischengespeichert werden. Sie können das Zeitlimit für den Proxy-Cache sogar auf -1 setzen, sodass niemals Inhalte von der Zentrale angefordert werden, die sich bereits im Proxy-Repository befinden.


Eine grundlegendere Lösung, wenn Sie nur mit lokalen Repositorys arbeiten, besteht darin, die updatePolicy für das zentrale Repository auf "nie" zu setzen. Dies bedeutet, dass Maven immer nur nach Artefakten sucht , die nicht bereits im lokalen Repository vorhanden sind. Dies kann dann bei Bedarf in der Befehlszeile überschrieben werden, indem der Schalter -U verwendet wird, um Maven zu zwingen, nach Updates zu suchen.

Sie würden das Repository (in Ihrem POM oder einem Profil in der settings.xml) wie folgt konfigurieren:

<repository>
  <id>central</id>
  <url>http://repo1.maven.org/maven2</url>
  <updatePolicy>never</updatePolicy>
</repository>
Reicher Verkäufer
quelle
Wir haben tatsächlich bereits ein zentrales Repository, aber wir veröffentlichen natürlich keine Snapshot-Builds, sodass ich vermutlich immer noch fehlgeschlagene Update-Überprüfungen mit dem vorhandenen Proxy / Spiegel erhalten würde - ich suche nach einer Möglichkeit, Maven zu erhalten für diese Artefakte überhaupt nicht nach Updates zu suchen.
Tim Gilbert
1
Es lohnt sich auch, ein logisches Repository in Ihrem zentralen Repository für Ihre SNAPSHOTs einzurichten. Dies bedeutet, dass sie von Ihren Entwicklern gemeinsam genutzt werden können und Sie nicht alle lokal erstellen müssen. Sie erhalten dann den vollen Nutzen von SNAPSHOTs, indem Sie Änderungen an SNAPSHOT-Abhängigkeiten übernehmen, sobald diese in das Remote-Repository übertragen werden.
Rich Seller
Danke - die updatePolicy-Flagge sieht genau so aus, wie ich gesucht habe.
Tim Gilbert
1
Mit Nexus können Sie auch Regeln konfigurieren, um zu verhindern, dass Anforderungen an Unternehmensartefakte nach außen gehen.
Brian Fox
Das XML-Snippet hier ist jetzt veraltet. Das updatePolicyElement steht unter dem Element snapshotsoder releases. Siehe: maven.apache.org/settings.html
Jeff Evans
5

Sehr einfach :

Verwenden Sie in Ihrem übergeordneten Super POM oder in der Datei settings.xml

        <repository>
        <id>central</id>
        <releases>
            <updatePolicy>never</updatePolicy>
        </releases>
        <snapshots>
            <updatePolicy>never</updatePolicy>
        </snapshots>
        <url>http://repo1.maven.org/maven2</url>
        <layout>legacy</layout>
    </repository>

Das sind meine Tipps

Bruno Régnier
quelle
0

Ich hatte ähnliche Probleme,

<repository>
    <id>java.net</id>
    <url>https://maven-repository.dev.java.net/nonav/repository</url>
    <layout>legacy</layout>
</repository>
<repository>
    <id>java.net2</id>
    <url>https://maven2-repository.dev.java.net/nonav/repository</url>
</repository>

Das Setzen von updatePolicy auf "nie" hat nicht funktioniert. Das Entfernen dieses Repos war die Art und Weise, wie ich es gelöst habe. ps: Ich habe dieses Tutorial über Webdienste verfolgt (übrigens wahrscheinlich das beste Tutorial für ws für Java)

drittens
quelle
1
Verwenden Sie Intellij? Weil Intellij + Maven = updatePolicy ignorieren. Siehe Fehlerbericht youtrack.jetbrains.com/issue/IDEA-76869
Manav