Come posso usare Maven attraverso un proxy?


130

Voglio condividere la mia esperienza di utilizzo di Maven tramite un proxy.

Molto probabilmente dovresti affrontare eccezioni e messaggi come:

metadati del repository per: 'org.apache.maven.plugins' non è stato recuperato da 
repository: centrale a causa di un errore: errore durante il trasferimento del file: connessione rifiutata: connessione

o

[AVVISO] Impossibile recuperare il descrittore del plug-in per org.apache.maven.plugins: maven-clean-
plugin: 2.5: Plugin org.apache.maven.plugins: maven-clean-plugin: 2.5 o uno dei suoi 
le dipendenze non possono essere risolte: impossibile leggere il descrittore di artefatto per 
org.apache.maven.plugins: Maven-clean-plugin: vaso: 2.5

Come configurare Maven per usare il server proxy?


(Qualcuno) Ti dispiace riformulare questo in una vera domanda (come: come posso usare Maven attraverso un proxy?)? Potresti quindi pubblicare il tuo corpo di domanda come risposta, per essere più in linea con il formato StackOverflow.
Tim

L'ho riformulato per te Bogdan, per favore pubblica il contenuto originale come risposta se lo desideri
Rich Seller

sembra che abbiamo modificato allo stesso tempo
Rich Seller

Risposte:


145

Per i dettagli sull'impostazione di un proxy per Maven, consultare la mini guida .

In sostanza, è necessario assicurarsi che la sezione proxy nelle impostazioni globali ( [maven install]/conf/settings.xml) o nelle impostazioni utente ( ${user.home}/.m2/settings.xml) sia configurata correttamente. È meglio farlo nelle impostazioni dell'utente per evitare di memorizzare la password in testo normale in un luogo pubblico.

Maven 2.1 ha introdotto la crittografia della password , ma non ho avuto modo di verificare se la crittografia si applica sia alle impostazioni del proxy che alle password del repository (non vedo perché non lo farebbe).

Per informazioni, c'è una configurazione proxy commentata in settings.xml e istruzioni su come modificarla.

Dalla mini guida, le tue impostazioni dovrebbero assomigliare a questa:

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

Grazie, ma questo post è piuttosto un suggerimento per gli altri piuttosto che una domanda. Ho già risolto questo problema, ma ho dedicato troppo tempo a cose non ovvie. Ho pubblicato questo in modo che possa essere utile per qualcuno.
Bogdan,

7
non riesco a trovare il file setting.xml nella directory m2. qualche idea del perché? @Rich Seller
Ariox66,

5
Devi metterlo lì. Puoi trovare un esempio settings.xml da maven_home, la posizione in cui hai decompresso i file binari di maven.
Ravi,

E se il proxy non necessita di autenticazione, gli elementi <username>e <password>devono essere rimossi (e non devono contenere contenuti vuoti). Mi ci è voluto un po 'di tempo per capire.
dmcontador,

50

Come usare un proxy calze?

Imposta un tunnel SSH su un server da qualche parte:

ssh -D $PORT $USER@$SERVER

Linux (bash):

export MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"

Finestre:

set MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"

2
L'utilizzo di un proxy Socks MAVEN_OPTSè l'unico modo per far scaricare Maven tramite HTTPS. L'uso dei proxy HTTP o HTTPS, tramite MAVEN_OPTSo settings.xml, risulta inorg.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
Mihai Capotă

Per httpproxy:export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=$PORT"
Omid

Eccellente grazie. Se si desidera utilizzare queste opzioni una sola volta per un singolo comando, è possibile digitare: MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" mvn clean installI mvncomandi successivi nella stessa sessione saranno senza proxy.
Eric Duminil,

29

Ho avuto anche questo problema e l'ho risolto modificando il settings.xmlfile nella mia .m2cartella. Il mio settings.xmlè così adesso:

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

1
Questo non sta scaricando i file jar nel mio caso. Ho provato di tutto
Faizan Mubasher il

28

Si noti inoltre che alcuni plug-in (vengono in mente risorse remote) utilizzano una libreria molto vecchia che accetta solo la configurazione proxy tramite MAVEN_OPTS;

-Dhttp.proxyHost=<host> -Dhttp.proxyPort=<port> -Dhttps.proxyHost=<host> -Dhttps.proxyPort=<port>

Potresti essere bloccato su auth per questo.


Non ha funzionato per me su Ubuntu 14.04 con maven 3.0.5 dal repository Ubuntu. La configurazione del proxy nel file settings.xml ha funzionato.
Mihai Capota

1
Ha funzionato per me su Ubuntu 14.04 con Maven 3.0.4
rmv

Un esempio della necessità di impostare MAVEN_OPTS in questo modo è la creazione di Maven dall'origine utilizzando Maven. Senza MAVEN_OPTS, non riesce a scaricare LICENSE-2.0, nonostante il download di molti JAR.
Permaquid,

@krosenvold grazie, questa soluzione ha funzionato per me. Avevo già impostato il proxy in settings.xml ma c'era un plugin cxf che voleva generare il codice da wsdl che non funzionava. Questo risolto il mio problema.
Vishal Vijayan,

23

Per impostare il proxy Maven :

Modifica la sessione proxy nel tuo file ~ / .m2 / settings.xml . Se non riesci a trovare il file, creane uno.

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

o

Modifica la sessione proxy nel tuo {M2_HOME} /conf/settings.xml

Spero che sia d'aiuto.. :)


15

Questi sono causati molto probabilmente da 2 problemi:

  1. Devi aggiungere la configurazione proxy a settings.xml. Ecco un trucco nel campo del tuo nome utente. Assicurati che assomigli a dominio \ nomeutente. Impostare il dominio lì e mettere questa barra esatta è importante '\'. È possibile che si desideri utilizzare il tag <! [CDATA []]> se la password contiene caratteri non compatibili con xml.
  2. Ho notato che maven 2.2.0 a volte non funziona affatto attraverso un proxy, dove 2.2.1 funziona perfettamente.

Se alcuni di questi vengono omessi, Maven potrebbe non riuscire con messaggi di errore casuali.

Spero solo di aver salvato qualcuno dal cercare su Google questo problema per 6 ore, come ho fatto io.


Stai usando un proxy NTLM? dalla mini guida: "Notare che [c] attualmente i proxy NTLM non sono supportati in quanto non sono stati testati. È possibile utilizzare le proprietà di sistema rilevanti su JDK 1.4+ per farlo funzionare."
Rich Seller

Non ne sono sicuro. Questo è un proxy aziendale che in realtà si trova a 600 miglia da me e nessuno dell'amministrazione del sistema è in carica questo fine settimana. Quindi non posso chiedere a nessuno adesso. Sarà interessante scoprirlo. So che supporta http, calze e altri protocolli. Forse è anche NTML.
Bogdan,

14

Solo per aggiungere le mie esperienze personali con questo: il proxy della mia azienda è http://webproxy.intra.companyname.com:3128. Affinché Maven funzioni tramite questo proxy, le impostazioni devono essere esattamente così

<settings>
  <proxies>
    <proxy>
      <id>default</id>
      <active>true</active>
      <protocol>http</protocol>
      <host>webproxy.intra.companyname.com</host>
      <port>3128</port>
    </proxy>
  </proxies>
</settings>

A differenza di altri file di configurazione proxy, protocolqui viene descritto come connettersi al server proxy, non quali tipi di protocollo devono essere sottoposti a proxy. La httpparte della destinazione deve essere separata dal nome host, altrimenti non funzionerà.


In questo momento ho appena sperimentato il contrario. Il protocollo qui è per descrivere quale protocollo dovrebbe usare questo proxy. Ho appena ottenuto la configurazione di un proxy protocollo https che si collega a un proxy http utilizzando <protocol> https </protocol>
Olivier Amblet

Grazie! Questo ha funzionato per me! Avevo pre-sospeso "http: //" e avrebbe fallito
Jesse McCall il

11

Grazie @krosenvold.

Se le modifiche al file delle impostazioni non funzionano, provare questo nel prompt dei comandi con il file POM.

mvn install -Dhttp.proxyHost=abcproxy -Dhttp.proxyPort=8080 -Dhttps.proxyHost=abcproxy -Dhttps.proxyPort=8080

Questo mi ha aiutato immediatamente dopo una modifica della password.


11

Corro cntlmlocalmente, configurato con NTLMv2hash di password per l'autenticazione con il proxy aziendale e utilizzo

export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=3128"

per usare quel proxy da maven. Ovviamente il proxy che usi dovrebbe supportare cntlm/ NTLMv2.


`set MAVEN_OPTS = -DproxyHost = 127.0.0.1 -DproxyPort = 3128` per windows
qxo

PowerShell può impostare una variabile di ambiente di sistema: [Environment]::SetEnvironmentVariable("MAVEN_OPTS", "-DproxyHost=127.0.0.1 -DproxyPort=3128", "Machine")
Boggin

6

E per aggiungere a questo argomento, ecco le mie esperienze qui sotto ... Davvero strane e dispendiose in termini di tempo, quindi ho pensato che valesse la pena aggiungere.

Ho avuto un problema simile nel tentativo di creare il portlet-bridge su Windows, ottenendo i seguenti errori:

Download: http://repo1.maven.org/maven2/org/apache/portals/bridges-pom/1.0/bridges-pom-1.0.pom
[DEBUG] Lettura del file di tracciamento della risoluzione C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[DEBUG] Scrittura del file di tracciamento della risoluzione C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[ERRORE] La build non ha potuto leggere 1 progetto -> [Guida 1]
org.apache.maven.project.ProjectBuildingException: si sono verificati alcuni problemi durante l'elaborazione dei POM:
[FATAL] POM principale non risolvibile: impossibile trasferire artefatto
org.apache.portals: bridges-pom: pom: 1.0 da / verso central (http://repo1.maven.org/maven2): errore nel trasferimento del file: repo1.maven.org e 'parent.relativePath' punti in locale errato
POM @ linea 23, colonna 11
...
[ERRORE] Il progetto org.apache.portals.bridges: portals-bridges-common: 2.0 (H: \ path_to_project \ portals-bridges-common-2.0 \ pom.xml) ha 1 errore
[ERRORE] POM padre non risolvibile: impossibile trasferire artefatto org.apache.portals: bridges-pom: pom: 1.0 da / a centrale (http://repo1.maven.org/maven2):
Errore durante il trasferimento del file: repo1.maven.org e 'parent.relativePath' indicano punti POM @ locali 23 errati, colonna 11: Host sconosciuto repo1.maven.org -> [Help 2]
...
[ERRORE] Per ulteriori informazioni sugli errori e sulle possibili soluzioni, leggere i seguenti articoli:
[ERRORE] [Aiuto 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERRORE] [Aiuto 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

Ho provato un paio di cose, seguendo un po 'di navigazione:

  • Ho cercato di impostare parent.relativePath come vuoto in modo che Maven non pensasse che il genitore fosse locale. Questo è secondo il suggerimento su SO al fallimento della compilazione di Hudson: POM padre non risolvibile e in questo forum nabble . Questo non ha avuto effetto.

  • Ho anche cercato di assicurarmi che il repository fosse esplicitamente elencato in settings.xml ma anche questo non ha avuto alcun effetto.

  • Ho quindi assicurato che mvn fosse costretto a cercare il repository, piuttosto che fare affidamento sulla sua stessa storia, come discusso in questo blog da Sarthon . Sfortunatamente, questo non era nemmeno il problema.

  • In preda alla disperazione, ho quindi rivisitato i miei MAVEN_OPTS per assicurarmi di non sbagliare le mie impostazioni proxy. Questi erano corretti, sebbene con il valore non quotato:

    impostare MAVEN_OPTS = -Dhttp.proxyHost = myproxy.mycompany.com -Dhttp.proxyPort = 8080 -Xmx256m

  • Quindi, finalmente, ho spostato la configurazione del proxy nel mio settings.xml e questo ha funzionato:

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

Davvero non so perché il mio MAVEN_OPTS originale non funzionasse (virgolette?) Mentre la configurazione settings.xml funzionava. Vorrei invertire la correzione e controllare di nuovo ogni passaggio, ma ho perso troppo tempo. Riferirà come e quando.


Hai effettivamente specificato un nome utente e una password anche in MAVEN_OPTS?
bcmoney,

1
Non credo di averlo fatto, ma non è necessario per il mio server proxy. Come puoi vedere, è possibile. A parte i problemi di sicurezza, puoi provarlo. Ho capito che hai ancora problemi ad arrivare così lontano allora?
wmorrison365,

4

So che questa non è davvero una risposta alla domanda, ma potrebbe valere la pena conoscerla per qualcuno che cerca questo post. È anche possibile installare un proxy repository Maven come Nexus .

Il tuo dispositivo verrà configurato per contattare il proxy Nexus locale e Nexus recupererà (e memorizzerà nella cache) gli artefatti. Può essere configurato tramite un'interfaccia Web e ha il supporto per proxy (http)).

Questo può essere un vantaggio, specialmente in ambito aziendale, poiché i manufatti sono disponibili localmente e possono essere scaricati velocemente e non si dipende più dalla disponibilità di repository Maven esterni.

Per ricollegare alla domanda; con Nexus esiste una buona interfaccia grafica per la configurazione del proxy, che deve essere eseguita in un unico posto e non per tutti gli sviluppatori.


3

se sei nuovo alla configurazione del proxy per Maven Nel mio caso prima vai e controlla il meteo della tua cartella Home c'è una .m2cartella e in essa dovrebbe esserci un file chiamato settings.xmlse non crearlo, incollalo e cambia hoste port, se necessario, modifica ilnonProxyHosts

Cartella principale - C: \ Users \ {Nome utente}

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

In ogni caso, ciò non ha esito positivo, procedere e apportare le modifiche in questa posizione della cartella Home

/conf/settings.xml

Sto usando Eclipse come mio IDE
Spero che questo possa aiutare !!

Nota: per rimuovere il proxy basta spostarsi settings.xmlin un altro posto


Per rimuovere il proxy basta spostare settings.xml in qualche altro posto
Akitha_MJ il

1

Se lavori Maven per delega, ma non alcuni dei plugin è invocare, provare a impostare JAVA_TOOL_OPTIONSanche con-Dhttp*.proxy* impostazioni.

Se lo hai già JAVA_OPTSfatto

export JAVA_TOOL_OPTIONS=$JAVA_OPTS

0

Fatta eccezione per le tecniche sopra menzionate, con un certo sforzo, è possibile eseguire Mavven tramite proxy utilizzando la libreria jproxyloader (nella pagina c'è un esempio su come eseguire questa operazione: http://jproxyloader.sourceforge.net/ ). Ciò consente di impostare il proxy calze solo per il download di artefatti.

Nella soluzione menzionata da duanni (impostazione -DsocksProxyHost) c'è un problema. Se hai test di integrazione in esecuzione sul database locale (o un altro test di connessione all'URL che non dovrebbe passare tramite proxy). Questi test smetteranno di funzionare perché anche le connessioni al database verranno indirizzate al proxy. Con l'aiuto di jProxyLoader puoi impostare il proxy solo per l'host nexus. Inoltre, se lo desideri, puoi passare le connessioni al database tramite un altro proxy.


0

Alcune volte è necessario aggiungere altri <proxy></proxy>tag e specificare https nei tag del protocollo:<protocol>https</protocol>


0

I post precedenti mi hanno aiutato a risolvere il mio problema. Oltre a quanto sopra ho dovuto apportare le seguenti modifiche per farlo funzionare:

  • Modificate le impostazioni di rete JRE di Maven (\ jre \ lib \ net.properties) per utilizzare le impostazioni proxy del sistema.

    https.proxyHost=proxy DNS
    https.proxyPort=proxy port
  • Impostazioni del server proxy incluse in settings.xml. Non ho fornito le impostazioni di nome utente e password per l'uso dell'autenticazione NTLM.


0

Maven fornisce un metodo integrato per farlo, tramite un file chiamato settings.xml , e questo è stato trattato in altre risposte. Tuttavia, è consuetudine, in particolare in Linux, che gli strumenti da riga di comando utilizzinohttps_proxy automaticamente il proxy specificato dalla variabile di ambiente .

Seguire il principio Non ripetere te stesso (che ha lo scopo di aiutarti a evitare errori), sarebbe bello semvn potesse funzionare automaticamente anche con quello.

Ecco uno script di shell che effettua le conversioni necessarie:

#! /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} $@

Potresti nominare qualcosa del genere proxied_mvned eseguirlo come:

$ https_proxy=http://localhost:58080 ./proxied_mvn clean package

In alternativa, puoi semplicemente spostare la configurazione dell'ambiente negli script di avvio.

trabocchetti

Ci sono molte cose che possono andare storte quando si tenta di configurare Maven per l'accesso a un Nexus tramite un proxy. Speriamo che questa sceneggiatura possa aiutare con alcuni dei problemi più delicati, ma altri rimangono:

  • Credenziali Nexus disponibili e corrette (solo se necessarie)

    Controllare con mvn help:effective-settings

  • Maven caching: "la risoluzione non verrà tentata"

    mvn clean package --update-snapshots

  • Output wall-of-text Maven: è necessario esaminare attentamente l'output per assicurarsi che i messaggi di errore non siano leggermente diversi tra le esecuzioni

  • Le versioni precedenti di Java potrebbero richiedere _JAVA_OPTIONSinvece di JAVA_TOOL_OPTIONS.

epilogo

Esiste più di un tipo di proxy . Di conseguenza, c'è più di un modo in cui questa domanda è stata interpretata - contribuendo al gran numero di risposte disparate qui.

Ho esplicitamente affrontato il caso di un (forward HTTP / HTTPS) server proxy Web , che viene utilizzato per accedere a Internet all'interno di una rete aziendale (per alcune società). Ciò può essere in particolare distinto da un proxy SOCKS , che è stato anche affrontato in alcune risposte qui.

A proposito, dal momento che usa JAVA_TOOL_OPTIONS , questa soluzione può essere applicata anche all'esecuzione di altre tue applicazioni Java all'interno di un proxy .


Suggerimento per la separazione ... Il mio esempio sopra usa http://localhost:58080. Questo perché ho impostato il port forwarding dal mio CLIENT_PROXY=localhost:58080al proxy di rete effettivo utilizzando WSL sul mio client di accesso remoto per eseguire:

ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.