Wie konfiguriere ich Maven für die Offline-Entwicklung?


117

Benötigt Maven irgendwann eine Verbindung zum Internet, um es nutzen zu können? Bedeutet das, speziell die internen Maven-Plugins zum Kompilieren, Reinigen, Verpacken usw. zu erhalten?


Haben Sie eine Maschine mit Internetzugang? Vielleicht ein Server?
Marcelo

2
Wir tun es, aber es ist gut, mühsam, Dinge von dort in die Entwicklungsumgebung zu bringen.

Antworten:


163

Sie können maven im Offline-Modus ausführen mvn -o install. Natürlich schlagen alle Artefakte fehl, die in Ihrem lokalen Repository nicht verfügbar sind. Maven basiert nicht auf verteilten Repositorys, aber sie machen die Dinge sicherlich nahtloser. Aus diesem Grund verwenden viele Geschäfte interne Spiegel, die schrittweise mit den zentralen Repos synchronisiert werden.

Darüber hinaus mvn dependency:go-offlinekönnen Sie damit sicherstellen, dass alle Ihre Abhängigkeiten lokal installiert sind, bevor Sie offline arbeiten.


In Übereinstimmung mit dieser Antwort entdeckte ich, dass mvn mit seinen "Kern" -Plugins (dh Compiler) geliefert wird. So kann ich mit mvn install bekommen, was ich brauche.

8
Bedenken Sie auch, dass Sie "mvn dependency: go-offline" verwenden können, um sicherzustellen, dass alle in Ihrer pom.xml genannten Abhängigkeiten in Ihrem lokalen Repository vorhanden sind.
Thorbjørn Ravn Andersen

10
Leider fängt mvn dependency:go-offlineeinfach nicht alles. In einer neuen virtuellen Maschine zum Beispiel muss mein Projekt auch nach dem Ausführen dieses Ziels noch Dinge herunterladen. Siehe auch dieses Problem .
Phs

2
Meine Erfahrung zeigt, dass die Option -o nicht richtig funktioniert und dass das Go-Offline-Ziel bei weitem nicht ausreicht, um einen vollständigen Offline-Build zu ermöglichen: Siehe die Lösung, die ich hier gefunden habe: stackoverflow.com/q/43661755/1767316
user1767316

Wenn Sie das Flag -llr zusätzlich zu -o hinzufügen, sollte es funktionieren.
Udo

10

Wenn Sie einen PC mit Internetzugang in Ihrem LAN haben, sollten Sie ein lokales Maven-Repository installieren.

Ich empfehle Artifactory Open Source . Dies ist, was wir in unserer Organisation verwenden, es ist wirklich einfach einzurichten.

Artifactory fungiert als Proxy zwischen Ihrem Build-Tool (Maven, Ant, Ivy, Gradle usw.) und der Außenwelt.

Remote-Artefakte werden zwischengespeichert, sodass Sie sie nicht immer wieder herunterladen müssen.

Es blockiert unerwünschte (und manchmal sicherheitsrelevante) externe Anforderungen für interne Artefakte und steuert, wie und wo Artefakte bereitgestellt werden und von wem.

Nach dem Einrichten von Artifactory müssen Sie nur noch Mavens settings.xmlin den Entwicklungsmaschinen ändern :

<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <mirrors>
    <mirror>
      <mirrorOf>*</mirrorOf>
      <name>repo</name>
      <url>http://maven.yourorganization.com:8081/artifactory/repo</url>
      <id>repo</id>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <repositories>
        <repository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>libs-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-release</url>
        </repository>
        <repository>
          <snapshots />
          <id>snapshots</id>
          <name>libs-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/libs-snapshot</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
          <id>central</id>
          <name>plugins-release</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-release</url>
        </pluginRepository>
        <pluginRepository>
          <snapshots />
          <id>snapshots</id>
          <name>plugins-snapshot</name>
          <url>http://maven.yourorganization.com:8081/artifactory/plugins-snapshot</url>
        </pluginRepository>
      </pluginRepositories>
      <id>artifactory</id>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>artifactory</activeProfile>
  </activeProfiles>
</settings>

Wir haben diese Lösung verwendet, weil wir Probleme mit dem Internetzugang in unseren Entwicklungsmaschinen hatten und einige Artefakte beschädigte Dateien heruntergeladen oder überhaupt nicht heruntergeladen haben. Wir hatten seitdem keine Probleme mehr.


Es gibt keinen Computer mit Zugriff, der mit dem LAN verbunden ist.

2
Mit artifactory können Sie Ihr gesamtes Repository sichern und es dann auf einem der PCs im LAN wiederherstellen.
Marcelo

7

Hierfür haben Sie zwei Möglichkeiten:

1.) Nehmen Sie Änderungen in der settings.xml vor und fügen Sie diese im ersten Tag hinzu

<localRepository>C:/Users/admin/.m2/repository</localRepository>

2.) Verwenden Sie das Tag -o für den Offline-Befehl.

mvn -o clean install -DskipTests=true
mvn -o jetty:run

6

Maven benötigt die Abhängigkeiten in Ihrem lokalen Repository. Der einfachste Weg, sie zu erhalten, ist der Internetzugang (oder schwieriger, andere hier bereitgestellte Lösungen zu verwenden).

Angenommen , Sie können vorübergehend einen Internetzugang erhalten, können Sie sich darauf vorbereiten, mit dem Maven-Dependency-Plugin mit seiner Abhängigkeit: Go-Offline- Ziel offline zu gehen . Dadurch werden alle Ihre Projektabhängigkeiten in Ihr lokales Repository heruntergeladen (Änderungen an den Abhängigkeiten / Plugins erfordern natürlich einen neuen Zugriff auf das Internet / das zentrale Repository).


4

Leider dependency:go-offlinehat es bei mir nicht funktioniert, da es nicht alles zwischengespeichert hat, dh. POMs-Dateien und andere erwähnen implizit Abhängigkeiten.

Die Problemumgehung bestand darin, einen lokalen Repository-Speicherort anzugeben , entweder innerhalb einer settings.xmlDatei mit <localRepository>...</localRepository>oder durch Ausführen mvnmit einem -Dmaven.repo.local=...Parameter. Nach der ersten Projekterstellung sollten alle erforderlichen Artefakte zwischengespeichert werden. Anschließend können Sie den Repository-Speicherort auf die gleiche Weise referenzieren, während Sie die Maven-Erstellung im Offline-Modus ausführen ( mvn -o ...).


3

Bevor Sie offline gehen, müssen Sie sicherstellen, dass sich alles in Ihrem lokalen Repo befindet, was für die Offline-Arbeit erforderlich ist. Wenn Sie "mvn dependency: go-offline" für die Projekte / pom (s) ausführen, an denen Sie arbeiten möchten, wird der Aufwand dafür verringert.

Aber es ist normalerweise nicht die ganze Geschichte, denn Abhängigkeit: go-offline lädt nur die "Bare Build" -Plugins herunter ( go-offline / resolve-plugins löst nicht alle Plugin-Abhängigkeiten auf ). Sie müssen also einen Weg finden, um Deploy / Test / Site-Plugins (und möglicherweise andere) und deren Abhängigkeiten in Ihr Repo herunterzuladen.

Abhängigkeit: go-offline lädt das Artefakt des pom selbst nicht herunter, daher müssen Sie abhängig sein: Kopieren Sie es bei Bedarf.

Manchmal - wie MaDa schrieb - wissen Sie nicht, was Sie brauchen, wenn Sie offline sind, was es ziemlich unmöglich macht, ein "ausreichendes" Repo zu haben.

Wenn Sie ein ordnungsgemäß gefülltes Repo haben, müssen Sie nur "<offline> true </ offline>" zu Mavens settings.xml hinzufügen, um offline zu gehen.

Ändern Sie nicht das Maven-Profil (ID), mit dem Sie Ihr Repo gefüllt haben, während Sie offline sind. Maven erkennt die heruntergeladenen Artefakte in seinen Metadaten mit einer "Identität", die an die Profil-ID gebunden ist.


3

Wenn Sie IntelliJ verwenden, können Sie einfach zu Einstellungen -> Erstellen, Ausführen, Bereitstellen -> Build-Tools -> Maven gehen und Offline arbeiten aktivieren / deaktivieren .


1
Ähnlich - Eclipse ist Fenster -> Einstellungen -> Maven und überprüfen Sie "Offline"
Stuart Brock

2

Geht das für dich?

http://jojovedder.blogspot.com/2009/04/running-maven-offline-using-local.html

Vergessen Sie nicht, es Ihrem Plugin-Repository hinzuzufügen und die URL auf die Stelle zu verweisen, an der sich Ihr Repository befindet.

<repositories>
    <repository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>local</id>
        <url>file://D:\mavenrepo</url>
    </pluginRepository>
</pluginRepositories>

Wenn nicht, müssen Sie möglicherweise einen lokalen Server, z. B. Apache, auf Ihren Computern ausführen.


Das scheint eher für Abhängigkeiten und Plugins wie die Plugins Jetty, Tomcat usw. zu sein. Ich bin mehr besorgt über die internen Maven-Plugins wie Maven-Compiler-Plugin

1
@predhme: Dieser Ansatz funktioniert für alle Plugins, da alle diese in das Maven-Repository auf Ihrem lokalen Computer gehen
JoseK

2


(Quelle: jfrog.com )

oder

Verwenden Sie einfach Maven-Repository-Server wie Sonatype Nexus http://www.sonatype.org/nexus/ oder JFrog Artifactory https://www.jfrog.com/artifactory/ .

Nachdem ein Entwickler ein Projekt erstellt hat, erfordert die Erstellung durch die nächsten Entwickler oder Jenkins CI keinen Internetzugang.

Auf dem Maven-Repository-Server können auch Proxys konfiguriert sein, die auf Maven Central (oder mehr benötigte öffentliche Repositorys) zugreifen, und sie können eine Liste von Artefakten in Remote-Repositorys synchronisieren.


1

Meine Erfahrung zeigt, dass die Option -o nicht richtig funktioniert und dass das Go-Offline-Ziel bei weitem nicht ausreicht, um einen vollständigen Offline-Build zu ermöglichen:

Die Lösung, die ich validieren konnte, umfasst die Verwendung der --legacy-local-repositoryOption maven anstelle der Option -o(offline) und die Verwendung des lokalen Repositorys anstelle des Verteilungsrepositorys

Außerdem musste ich alle maven-metadata-maven2_central.xmlDateien des Local-Repo in die maven-metadata.xmlvon Maven erwartete Form kopieren.

Sehen Sie die Lösung, die ich hier gefunden habe .


0

Direkte Beantwortung Ihrer Frage: Es ist keine Internetverbindung erforderlich, sondern der Zugriff auf ein Repository im LAN oder auf der lokalen Festplatte (verwenden Sie Hinweise von anderen Personen, die hier gepostet haben).

Wenn sich Ihr Projekt nicht in einer ausgereiften Phase befindet, dh wenn POMs häufig geändert werden, ist der Offline-Modus sehr unpraktisch, da Sie Ihr Repository auch häufig aktualisieren müssen. Es sei denn, Sie können eine Kopie eines Repositorys erhalten, das alles enthält, was Sie benötigen. Aber woher wissen Sie das? Normalerweise starten Sie ein Repository von Grund auf neu und es wird während der Entwicklung schrittweise geklont (auf einem Computer, der mit einem anderen Repository verbunden ist). Eine Kopie des öffentlichen Repositorys repo1.maven.org wiegt Hunderte von Gigabyte, daher würde ich Brute Force auch nicht empfehlen.


Es ist, aber nicht als Maven-Projekt (Ameise). Ich habe also alle Bibliotheken, die ich brauche, habe mich aber speziell über die internen Bibliotheken von Maven gewundert. Wie zum Beispiel Maven-Plugin-Compiler.

Wenn Sie alle von Ant verwalteten Abhängigkeiten haben, fehlen Ihnen wahrscheinlich ohnehin Maven-Metadaten, sodass Maven sie nicht aufnimmt. "Maven internal libs" können nur heruntergeladen werden, indem Sie Ihre POM-Struktur erstellen und auf einem mit dem Internet verbundenen Computer ausführen. Mit "run it" meine ich die Ausführung jedes Ziels, von dem Sie glauben, dass Sie es verwenden werden, nicht unbedingt nur "mvn clean install".
MaDa

0

In Vorbereitung vor dem Offline-Arbeiten einfach ausführen mvn dependency:go-offline


0

Ein neues Plugin hat anscheinend folgende Mängel behoben mvn dependency:go-offline:

https://github.com/qaware/go-offline-maven-plugin

Fügen Sie es Ihrem Pom hinzu und führen Sie es aus mvn -T1C de.qaware.maven:go-offline-maven-plugin:resolve-dependencies. Sobald Sie alle dynamischen Abhängigkeiten eingerichtet haben, wird maven nicht mehr versuchen, etwas erneut herunterzuladen (bis Sie die Versionen aktualisieren).


-2
<offline> false </offline>

<localRepository>${user.home}/.m2/repository</localRepository>

zu

<offline> true <offline>

<localRepository>${user.home}/.m2/repository</localRepository>

Ändern Sie das Offline-Tag von false in true.

wird von repo online heruntergeladen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.