Jak skonfigurować Maven do programowania offline?

117

Czy Maven wymaga w pewnym momencie połączenia z Internetem, aby móc z niego korzystać? Czy chodzi konkretnie o uzyskanie wewnętrznych wtyczek Maven do kompilowania, czyszczenia, pakowania itp.?


źródło
Czy masz maszynę z dostępem do internetu? Może serwer?
Marcelo
2
Tak, ale przenoszenie rzeczy stamtąd do środowiska programistycznego jest dobrze, żmudne.

Odpowiedzi:

163

Możesz uruchomić maven w trybie offline mvn -o install. Oczywiście wszelkie artefakty niedostępne w lokalnym repozytorium zawiodą. Maven nie jest oparty na repozytoriach rozproszonych, ale z pewnością ułatwiają pracę. Z tego powodu wiele sklepów korzysta z wewnętrznych serwerów lustrzanych, które są stopniowo synchronizowane z centralnymi repozytoriami.

Ponadto mvn dependency:go-offlinemożna użyć, aby upewnić się, że wszystkie zależności są zainstalowane lokalnie, zanim zaczniesz pracować w trybie offline.

nsfyn55
źródło
W połączeniu z tą odpowiedzią odkryłem, że mvn zawiera swoje "podstawowe" wtyczki (tj. Kompilator). Więc dzięki instalacji mvn mogę uzyskać to, czego potrzebuję.
8
Weź również pod uwagę, że możesz użyć "zależności mvn: go-offline", aby upewnić się, że wszystkie zależności, o których mowa w twoim pom.xml, są obecne w twoim lokalnym repozytorium.
Thorbjørn Ravn Andersen
10
Niestety mvn dependency:go-offlinepo prostu nie łapie wszystkiego. Na przykład w nowej maszynie wirtualnej mój projekt nadal musi pobierać rzeczy, nawet po uruchomieniu tego celu. Zobacz także to wydanie .
phs
2
Z mojego doświadczenia wynika, że ​​opcja -o nie działa poprawnie, a cel przejścia w tryb offline jest daleki od wystarczającego, aby umożliwić pełną kompilację offline: Zobacz rozwiązanie, które znalazłem tutaj: stackoverflow.com/q/43661755/1767316
user1767316
Jeśli dodasz flagę -llr dodatkowo do -o, to powinno działać.
Udo
10

Jeśli masz komputer z dostępem do Internetu w swojej sieci LAN, powinieneś zainstalować lokalne repozytorium Maven.

Polecam Artifactory Open Source . To jest to, czego używamy w naszej organizacji, jest naprawdę łatwe w konfiguracji.

Artifactory działa jako proxy między twoim narzędziem do budowania (Maven, Ant, Ivy, Gradle itp.) A światem zewnętrznym.

Buforuje zdalne artefakty, dzięki czemu nie musisz ich pobierać w kółko.

Blokuje niepożądane (a czasem wrażliwe na bezpieczeństwo) zewnętrzne żądania dotyczące wewnętrznych artefaktów i kontroluje, w jaki sposób i gdzie artefakty są wdrażane oraz przez kogo.

Po skonfigurowaniu Artifactory wystarczy zmienić Mavena settings.xmlw maszynach deweloperskich:

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

Skorzystaliśmy z tego rozwiązania, ponieważ mieliśmy problemy z dostępem do Internetu na naszych maszynach programistycznych i niektóre artefakty pobierały uszkodzone pliki lub w ogóle ich nie pobierały. Od tamtej pory nie mieliśmy problemów.

Marcelo
źródło
Nie ma maszyny z dostępem, która jest podłączona do sieci LAN.
2
Dzięki Artifactory możesz wykonać kopię zapasową całego repozytorium, a następnie przywrócić je na jednym z komputerów w sieci LAN.
Marcelo
7

Masz na to dwie możliwości:

1.) wprowadź zmiany w settings.xml dodaj to w pierwszym tagu

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

2.) użyj tagu -o dla polecenia offline.

mvn -o clean install -DskipTests=true
mvn -o jetty:run
Jyoti Prakash
źródło
6

Maven potrzebuje zależności w lokalnym repozytorium. Najłatwiej je zdobyć, korzystając z dostępu do internetu (lub trudniej, korzystając z innych rozwiązań przedstawionych tutaj).

Zakładając więc, że możesz tymczasowo uzyskać dostęp do Internetu, możesz przygotować się do przejścia w tryb offline za pomocą wtyczki maven-dependency-plugin z jej zależnością: cel przejścia w tryb offline . Spowoduje to pobranie wszystkich zależności projektu do lokalnego repozytorium (oczywiście zmiany w zależnościach / wtyczkach będą wymagać nowego dostępu do Internetu / centralnego repozytorium).

FrVaBe
źródło
4

Niestety dependency:go-offlinenie zadziałało, ponieważ nie zapisał wszystkiego w pamięci podręcznej, tj. Pliki POMs i inne niejawnie wspominają o zależnościach.

Obejście polega na określeniu lokalizacji lokalnego repozytorium , w settings.xmlpliku z parametrem <localRepository>...</localRepository>lub przez uruchomienie mvnz -Dmaven.repo.local=...parametrem. Po początkowej kompilacji projektu wszystkie niezbędne artefakty powinny zostać zapisane w pamięci podręcznej, a następnie można odwoływać się do lokalizacji repozytorium w ten sam sposób, podczas uruchamiania kompilacji Maven w trybie offline ( mvn -o ...).

luka5z
źródło
3

Przed przejściem do trybu offline musisz upewnić się, że wszystko znajduje się w lokalnym repozytorium, co jest wymagane podczas pracy w trybie offline. Uruchomienie "zależności mvn: go-offline" dla projektu (ów) / pom (ów), nad którymi zamierzasz pracować, zmniejszy wysiłki zmierzające do osiągnięcia tego.

Ale zwykle nie jest to cała historia, ponieważ zależność: go-offline pobierze tylko wtyczki "gołej kompilacji" ( go-offline / solution-plugins nie rozwiązuje wszystkich zależności wtyczek ). Musisz więc znaleźć sposób na pobranie wtyczek do wdrażania / testowania / witryny (i być może innych) i ich zależności do repozytorium.

Ponadto zależność: go-offline nie pobiera samego artefaktu pom, więc musisz się uzależnić: skopiuj go, jeśli to konieczne.

Czasami - jak napisał MaDa - nie wiesz, czego będziesz potrzebować będąc offline, co praktycznie uniemożliwia posiadanie „wystarczającego” repozytorium.

W każdym razie, mając prawidłowo wypełnione repozytorium, wystarczy dodać „<offline> true </offline>” do settings.xml Mavena, aby przejść do trybu offline.

Nie zmieniaj profilu (identyfikatora) Mavena, którego użyłeś do wypełnienia repozytorium, będąc offline. Maven rozpoznaje pobrane artefakty w swoich metadanych za pomocą „tożsamości”, która jest powiązana z identyfikatorem profilu.

Eike Pögel
źródło
3

Jeśli używasz IntelliJ, możesz po prostu przejść do Preferencje -> Kompilacja, wykonanie, wdrażanie -> Narzędzia kompilacji -> Maven i zaznaczyć / odznaczyć Pracuj offline .

heez
źródło
1
Podobnie - Eclipse to Window -> Preferences -> Maven i zaznacz „Offline”
Stuart Brock
2

Czy to działa dla Ciebie?

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

Nie zapomnij dodać go do repozytorium wtyczek i wskaż adres URL, gdziekolwiek jest twoje repozytorium.

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

Jeśli nie, być może będziesz musiał uruchomić lokalny serwer, np. Apache, na swoich maszynach.

gigadot
źródło
Wydaje się, że bardziej dotyczy to zależności i wtyczek, takich jak wtyczki jetty, tomcat itp. Bardziej niepokoją mnie wewnętrzne wtyczki maven, takie jak maven-compiler-plugin
1
@predhme: To podejście będzie działać dla wszystkich wtyczek, ponieważ wszystkie one trafiają do repozytorium maven na twoim lokalnym komputerze
JoseK
2


(źródło: jfrog.com )

lub

Po prostu użyj serwerów repozytorium Maven, takich jak Sonatype Nexus http://www.sonatype.org/nexus/ lub JFrog Artifactory https://www.jfrog.com/artifactory/ .

Gdy jeden programista zbuduje projekt, kompilacja przez kolejnych programistów lub Jenkins CI nie będzie wymagać dostępu do Internetu.

Serwer repozytorium Maven może również mieć skonfigurowane serwery proxy, aby uzyskać dostęp do Maven Central (lub bardziej potrzebnych repozytoriów publicznych), a także mogą mieć zinchowaną listę artefaktów w zdalnych repozytoriach.

Paul Verest
źródło
1

Z mojego doświadczenia wynika, że ​​opcja -o nie działa poprawnie, a cel przejścia w tryb offline jest daleki od wystarczającego, aby umożliwić pełną kompilację offline:

Rozwiązanie, które mógłbym zweryfikować, obejmuje użycie --legacy-local-repositoryopcji Maven zamiast -o(offline) oraz użycie lokalnego repozytorium zamiast repozytorium dystrybucji

Dodatkowo musiałem skopiować wszystkie maven-metadata-maven2_central.xmlpliki lokalnego repozytorium do maven-metadata.xmlpostaci oczekiwanej przez mavena.

Zobacz rozwiązanie, które znalazłem tutaj .

user1767316
źródło
0

Odpowiadając bezpośrednio na Twoje pytanie: nie wymaga połączenia internetowego, ale dostępu do repozytorium, w sieci LAN lub na dysku lokalnym (skorzystaj ze wskazówek innych osób, które tutaj pisały).

Jeśli twój projekt nie jest w fazie dojrzałej, oznacza to, że gdy POM są często zmieniane, tryb offline będzie bardzo niepraktyczny, ponieważ będziesz musiał dość często aktualizować repozytorium. Chyba że możesz zdobyć kopię repozytorium, które ma wszystko, czego potrzebujesz, ale skąd możesz to wiedzieć? Zazwyczaj repozytorium uruchamiasz od zera i jest ono klonowane stopniowo podczas tworzenia (na komputerze podłączonym do innego repozytorium). Kopia repozytorium publicznego repo1.maven.org waży setki gigabajtów, więc też nie polecałbym brutalnej siły.

MaDa
źródło
Jest, ale nie jako projekt maven (mrówka). Mam więc wszystkie biblioteki, których potrzebuję, ale zastanawiałem się konkretnie nad bibliotekami wewnętrznymi maven. Takich jak maven-plugin-compiler.
Jeśli masz wszystkie zależności obsługiwane przez Ant, prawdopodobnie i tak brakuje Ci metadanych Mavena, więc Maven ich nie pobierze. Jeśli chodzi o „wewnętrzne biblioteki Mavena”, jedynym sposobem ich pobrania jest zbudowanie struktury pom i uruchomienie jej na komputerze podłączonym do Internetu. Przez „uruchom to” mam na myśli wykonanie każdego celu, którego myślisz, że będziesz używać, niekoniecznie tylko „czystą instalację mvn”.
MaDa
0

W przygotowaniu przed rozpoczęciem pracy w trybie offline wystarczy uruchomić mvn dependency:go-offline

msangel
źródło
0

Pojawiła się nowa wtyczka, która naprawia niedociągnięcia mvn dependency:go-offline:

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

Dodaj go do pom, a następnie biegnij mvn -T1C de.qaware.maven:go-offline-maven-plugin:resolve-dependencies. Po skonfigurowaniu wszystkich zależności dynamicznych maven nie będzie próbować niczego więcej pobierać (dopóki nie zaktualizujesz wersji).

Jiehong
źródło
-2
<offline> false </offline>

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

do

<offline> true <offline>

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

Zmień tag offline z false na true.

pobierze z repozytorium online

dhanaraj k
źródło