Chcę podzielić się swoim doświadczeniem w korzystaniu z Mavena przez proxy.
Najprawdopodobniej spotkasz się z wyjątkami i wiadomościami typu:
Nie można pobrać metadanych repozytorium dla: „org.apache.maven.plugins” repozytorium: centralne z powodu błędu: Błąd podczas przesyłania pliku: Odmowa połączenia: połączenie
lub
[OSTRZEŻENIE] Nie udało się pobrać deskryptora wtyczki dla org.apache.maven.plugins: maven-clean- plugin: 2.5: Plugin org.apache.maven.plugins: maven-clean-plugin: 2.5 lub jedna z jego nie można rozwiązać zależności: nie można odczytać deskryptora artefaktu dla org.apache.maven.plugins: maven-clean-plugin: jar: 2.5
Jak skonfigurować Maven do korzystania z serwera proxy?
Odpowiedzi:
Aby uzyskać szczegółowe informacje na temat konfigurowania serwera proxy dla Maven, zobacz mini przewodnik .
Zasadniczo musisz upewnić się, że sekcja proxy w ustawieniach globalnych (
[maven install]/conf/settings.xml
) lub ustawieniach użytkownika (${user.home}/.m2/settings.xml
) jest poprawnie skonfigurowana. Lepiej jest to zrobić w ustawieniach użytkownika, aby uniknąć przechowywania hasła w postaci zwykłego tekstu w publicznej lokalizacji.Maven 2.1 wprowadził szyfrowanie haseł , ale nie udało mi się sprawdzić, czy szyfrowanie dotyczy zarówno ustawień proxy, jak i haseł repozytorium (nie widzę jednak, dlaczego by nie miał).
Aby uzyskać więcej informacji, w pliku settings.xml znajduje się zakomentowana konfiguracja serwera proxy oraz instrukcje dotyczące jej modyfikacji.
Z mini przewodnika Twoje ustawienia powinny wyglądać mniej więcej tak:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> [...] <proxies> <proxy> <active>true</active> <protocol>http</protocol> <host>proxy.somewhere.com</host> <port>8080</port> <username>proxyuser</username> <password>somepassword</password> <nonProxyHosts>www.google.com|*.somewhere.com</nonProxyHosts> </proxy> </proxies> [...] </settings>
źródło
<username>
i<password>
muszą zostać usunięte (bez podania pustej zawartości). Zajęło mi to trochę czasu, zanim zrozumiałem.Jak korzystać z serwera proxy skarpet?
Skonfiguruj gdzieś tunel SSH do serwera:
Linux (bash):
Okna:
źródło
MAVEN_OPTS
to jedyny sposób na pobranie Mavena przez HTTPS. Korzystanie z serwerów proxy HTTP lub HTTPS, za pośrednictwemMAVEN_OPTS
lubsettings.xml
, powodujeorg.apache.maven.wagon.providers.http.httpclient.impl.execchain.RetryExec execute INFO: I/O exception (java.net.SocketException) caught when processing request to {tls}->http://proxy.mycompany.com:911->https://repo.maven.apache.org:443: SOCKS: TTL expired
http
pełnomocnika:export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=$PORT"
MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" mvn clean install
Następnemvn
polecenia w tej samej sesji będą bez serwera proxy.Miałem też ten problem i rozwiązałem go edytując
settings.xml
plik w moim.m2
folderze. Mojesettings.xml
jest teraz takie:<settings> <proxies> <proxy> <id>genproxy</id> <active>true</active> <protocol>http</protocol> <host>proxyHost</host> <port>3128</port> <username>username</username> <password>password</password> </proxy> </proxies> </settings>
źródło
Zauważ również, że niektóre wtyczki (przychodzą na myśl zdalne zasoby) używają naprawdę starej biblioteki, która akceptuje konfigurację proxy tylko przez MAVEN_OPTS;
-Dhttp.proxyHost=<host> -Dhttp.proxyPort=<port> -Dhttps.proxyHost=<host> -Dhttps.proxyPort=<port>
W tym przypadku możesz utknąć na autoryzacji.
źródło
Aby ustawić serwer proxy Maven :
Edytuj sesję proxy w pliku ~ / .m2 / settings.xml . Jeśli nie możesz znaleźć pliku, utwórz go.
<settings> <proxies> <proxy> <id>httpproxy</id> <active>true</active> <protocol>http</protocol> <host>your-proxy-host</host> <port>your-proxy-port</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> <proxy> <id>httpsproxy</id> <active>true</active> <protocol>https</protocol> <host>your-proxy-host</host> <port>your-proxy-port</port> <nonProxyHosts>local.net|some.host.com</nonProxyHosts> </proxy> </proxies> </settings>
lub
Edytuj sesję proxy w swoim {M2_HOME} /conf/settings.xml
Mam nadzieję, że to pomoże.. :)
źródło
Są to najprawdopodobniej spowodowane 2 problemami:
Jeśli niektóre z nich zostaną pominięte - maven może zawieść i wyświetlić losowe komunikaty o błędach.
Mam tylko nadzieję, że uratowałem kogoś przed szukaniem w Google tego problemu przez 6 godzin, tak jak ja.
źródło
Dodam tylko moje własne doświadczenia z tym: proxy mojej firmy to
http://webproxy.intra.companyname.com:3128
. Aby maven działał za pośrednictwem tego proxy, ustawienia muszą być dokładnie takie<settings> <proxies> <proxy> <id>default</id> <active>true</active> <protocol>http</protocol> <host>webproxy.intra.companyname.com</host> <port>3128</port> </proxy> </proxies> </settings>
W przeciwieństwie do innych plików konfiguracyjnych proxy,
protocol
tutaj opisano, jak połączyć się z serwerem proxy, a nie jakie rodzaje protokołów powinny być używane przez proxy.http
Część tarczy musi być podzielona off z hosta, bo inaczej nie zadziała.źródło
Dzięki @krosenvold.
Jeśli zmiany w pliku ustawień nie działają, wypróbuj to w wierszu polecenia mając plik POM.
Pomogło mi to natychmiast po zmianie hasła.
źródło
Biegnę
cntlm
lokalnie, skonfigurowany zNTLMv2
mieszań haseł do uwierzytelniania serwera proxy korporacyjnej i wykorzystanieużywać tego serwera proxy z
maven
. Oczywiście serwer proxy, którego używasz, powinien obsługiwaćcntlm
/NTLMv2
.źródło
[Environment]::SetEnvironmentVariable("MAVEN_OPTS", "-DproxyHost=127.0.0.1 -DproxyPort=3128", "Machine")
A żeby dodać do tego tematu, oto moje doświadczenia poniżej ... Naprawdę dziwne i czasochłonne, więc pomyślałem, że warto to dodać.
Miałem podobny problem podczas próby zbudowania mostka portletów w systemie Windows, otrzymując następujące błędy:
Po pewnym czasie surfowania wypróbowałem kilka rzeczy:
Próbowano ustawić parametr parent.relativePath jako pusty, aby maven nie sądził, że rodzic jest lokalny. Jest to zgodne z sugestią dotyczącą niepowodzenia kompilacji SO w Hudson: nierozstrzygalny POM-rodzic nadrzędny i na tym forum do pobrania . To nie przyniosło skutku.
Próbowałem również upewnić się, że repozytorium zostało wyraźnie wymienione w moim settings.xml, ale to również nie miało wpływu.
Następnie upewniłem się, że mvn został zmuszony do przeszukania repozytorium, zamiast polegać na własnej historii, o czym pisał na tym blogu Sarthon . Niestety, to też nie był problem.
W pewnej desperacji ponownie odwiedziłem MAVEN_OPTS, aby upewnić się, że nie naruszam ustawień proxy. Były one poprawne, choć z wartością niecytowaną:
W końcu przeniosłem konfigurację proxy do mojego settings.xml i to zadziałało:
<proxies> <proxy> <id>genproxy</id> <active>true</active> <protocol>http</protocol> <!--username>proxyuser</username--> <!--password>proxypass</password--> <host>myproxy.mycompany.com</host> <port>8080</port> <nonProxyHosts>*.mycompany.com|127.0.0.1</nonProxyHosts> </proxy> </proxies>
Naprawdę nie jestem pewien, dlaczego mój oryginalny MAVEN_OPTS nie działał (cudzysłowy?), Podczas gdy konfiguracja settings.xml działała. Chciałbym cofnąć poprawkę i ponownie sprawdzić każdy krok, ale straciłem zbyt dużo czasu. Zgłosi się, jak i kiedy.
źródło
Wiem, że tak naprawdę nie jest to odpowiedź na pytanie, ale może warto wiedzieć, kto szuka tego postu. Możliwe jest również zainstalowanie serwera proxy repozytorium Maven, takiego jak nexus .
Twój maven zostanie skonfigurowany do kontaktowania się z lokalnym proxy Nexusa, a Nexus będzie pobierał (i buforował) artefakty. Może być konfigurowany przez interfejs WWW i obsługuje (http) proxy).
Może to być zaletą, zwłaszcza w środowisku firmowym, ponieważ artefakty są dostępne lokalnie i można je szybko pobrać, a Ty nie jesteś już tak zależny od dostępności zewnętrznych repozytoriów Maven.
Aby odnieść się do pytania; w Nexusie jest przyjemny GUI do konfiguracji proxy i trzeba to zrobić tylko w jednym miejscu, a nie dla każdego programisty.
źródło
jeśli jesteś nowy w ustawieniach proxy dla Maven W moim przypadku najpierw pójść i sprawdzić pogodę główna Folder istnieje
.m2
folder, aw nim nie powinno być plik o nazwiesettings.xml
jeśli nie tworzyć go i wklej to i zmianęhost
iport
, a następnie w razie potrzeby zmieńnonProxyHosts
<settings> <proxies> <proxy> <id>httpproxy</id> <active>true</active> <protocol>http</protocol> <host>your-proxy-host</host> <port>your-proxy-port</port> <nonProxyHosts>localhost</nonProxyHosts> </proxy> <proxy> <id>httpsproxy</id> <active>true</active> <protocol>https</protocol> <host>your-proxy-host</host> <port>your-proxy-port</port> <nonProxyHosts>localhost</nonProxyHosts> </proxy> </proxies> </settings>
Jeśli to się nie powiedzie, przejdź do zmian w tej lokalizacji folderu domowego
Używam Eclipse jako mojego IDE
Mam nadzieję, że to pomoże!
Uwaga: aby usunąć serwer proxy, po prostu przejdź
settings.xml
do innego miejscaźródło
Jeśli maven działa przez proxy, ale nie niektóre wtyczki, które wywołuje, spróbuj ustawić
JAVA_TOOL_OPTIONS
również-Dhttp*.proxy*
ustawienia.Jeśli już
JAVA_OPTS
to zróbźródło
Poza technikami wymienionymi powyżej, przy pewnym wysiłku, możesz uruchomić mavena przez proxy używając biblioteki jproxyloader (przykład jak to zrobić jest na stronie: http://jproxyloader.sourceforge.net/ ). Pozwala to na skonfigurowanie proxy skarpet tylko do pobierania artefaktów.
W rozwiązaniu wspomnianym przez duanni (ustawienie -DsocksProxyHost) jest jeden problem. Jeśli masz testy integracji uruchomione z lokalną bazą danych (lub inne testy łączące się z adresem URL, które nie powinny przechodzić przez proxy). Te testy przestaną działać, ponieważ połączenia z bazą danych będą również kierowane do serwera proxy. Z pomocą jProxyLoader możesz ustawić proxy tylko dla hosta nexus. Dodatkowo, jeśli chcesz, możesz przekazywać połączenia do bazy danych przez inne proxy.
źródło
Czasami trzeba dodać inne
<proxy></proxy>
tagi i określić https w tagach protokołu:<protocol>https</protocol>
źródło
Powyższe wpisy pomogły w rozwiązaniu mojego problemu. Oprócz powyższego musiałem wprowadzić następujące zmiany, aby to działało:
Zmodyfikowano ustawienia sieciowe JRE Mavena (\ jre \ lib \ net.properties), aby używać systemowych ustawień proxy.
Uwzględniono ustawienia serwera proxy w settings.xml. Nie podałem nazwy użytkownika i hasła, aby korzystać z uwierzytelniania NTLM.
źródło
Maven zapewnia wbudowaną metodę robienia tego za pośrednictwem pliku o nazwie settings.xml , co zostało omówione w innych odpowiedziach. Jednak zwyczajowo, szczególnie w Linuksie, narzędzia wiersza poleceń automatycznie używają serwera proxy określonego przez zmienną środowiskową
https_proxy
.Aby postępować zgodnie z zasadą „ Nie powtarzaj się ” (która ma na celu pomóc Ci uniknąć błędów), byłoby miło, gdybyś
mvn
mógł również z tym automatycznie pracować.Oto skrypt powłoki, który dokonuje niezbędnych konwersji:
#! /usr/bin/env bash function javaproxy { ## using "Shell Parameter Expansion" request_scheme=$1 ; proxy=$2 notscheme=$(echo ${proxy#*://}) ## parse scheme=$(echo ${proxy%${notscheme}}) ## remove scheme=$(echo ${scheme%://}) ## strip hostport=$(echo ${proxy#*//*}) ## parse host=$(echo ${hostport%:*}) ## parse port=$(echo ${hostport#${host}}) ## remove port=$(echo ${port#:}) ## strip scheme=$(echo ${scheme:-http}) ## default host=$(echo ${host:-localhost}) ## default port=$(echo ${port:-8080}) ## default echo -n " -D${request_scheme}.proxyHost=${host}" echo -n " -D${request_scheme}.proxyPort=${port}" } JTO="" if [ $http_proxy ] ; then JTO="${JTO}$(javaproxy http ${http_proxy})" fi if [ $https_proxy ] ; then JTO="${JTO}$(javaproxy https ${https_proxy})" fi if [ $no_proxy ] ; then JTO="${JTO} -Dhttp.nonProxyHosts=$(echo \"${no_proxy}\"|tr ',' '|')" fi export JAVA_TOOL_OPTIONS=${JTO} echo "JAVA_TOOL_OPTIONS=${JAVA_TOOL_OPTIONS}" mvn_friendliness_options+=--update-snapshots mvn ${mvn_friendliness_options} $@
Możesz nazwać to coś podobnego
proxied_mvn
i uruchomić jako:Alternatywnie możesz po prostu przenieść konfigurację środowiska do swoich skryptów startowych.
gotchas
Jest wiele rzeczy, które mogą się nie udać podczas próby skonfigurowania Mavena do dostępu do Nexusa przez proxy. Mamy nadzieję, że ten skrypt pomoże w niektórych z najbardziej skomplikowanych problemów, ale inne pozostają:
Dane logowania do Nexusa są dostępne i poprawne (tylko w razie potrzeby)
Sprawdź z
mvn help:effective-settings
Buforowanie Mavena: „rozdzielczość nie zostanie podjęta ponownie”
mvn clean package --update-snapshots
Wyjście ściany tekstu Maven - musisz uważnie przyjrzeć się wynikowi, aby upewnić się, że komunikaty o błędach nie różnią się subtelnie między uruchomieniami
Starsze wersje Java mogą wymagać
_JAVA_OPTIONS
zamiastJAVA_TOOL_OPTIONS
.epilog
Istnieje więcej niż jeden rodzaj proxy . Odpowiednio, istnieje więcej niż jeden sposób, w jaki zinterpretowano to pytanie - przyczyniając się do dużej liczby rozbieżnych odpowiedzi.
Wyraźnie odniosłem się do przypadku serwera proxy sieci Web (do przodu HTTP / HTTPS) , który jest używany do uzyskiwania dostępu do Internetu z sieci firmowej (w przypadku niektórych firm). Może się to wyraźnie różnić od proxy SOCKS , do którego również odniesiono się w niektórych odpowiedziach tutaj.
Aha tak na marginesie, skoro używa
JAVA_TOOL_OPTIONS
, to rozwiązania można zastosować uruchamiania innych aplikacji Java również w proxy .Wskazówka rozstania ... Mój przykład powyżej używa
http://localhost:58080
. Dzieje się tak, ponieważ skonfigurowałem przekierowanie portów z mojegoCLIENT_PROXY=localhost:58080
do rzeczywistego sieciowego serwera proxy, używając WSL na moim kliencie dostępu zdalnego, aby uruchomić:źródło