Comment utiliser Maven via un proxy?

130

Je souhaite partager mon expérience d'utilisation de maven via un proxy.

Vous feriez très probablement face à des exceptions et à des messages tels que:

Les métadonnées du référentiel pour: 'org.apache.maven.plugins' n'ont pas pu être extraites de 
référentiel: central en raison d'une erreur: Erreur lors du transfert du fichier: Connexion refusée: connexion

ou

[AVERTISSEMENT] Impossible de récupérer le descripteur de plugin pour org.apache.maven.plugins: maven-clean-
plugin: 2.5: Plugin org.apache.maven.plugins: maven-clean-plugin: 2.5 ou l'un de ses 
les dépendances n'ont pas pu être résolues: échec de la lecture du descripteur d'artefact pour 
org.apache.maven.plugins: maven-clean-plugin: jar: 2.5

Comment configurer Maven pour utiliser un serveur proxy?

Bogdan
la source
(N'importe qui) Ça vous dérange de reformuler cela en une question réelle (comme: Comment utiliser Maven via un proxy?)? Vous pouvez ensuite publier le corps de votre question en tant que réponse, pour être plus en ligne avec le format StackOverflow.
Tim
Je l'ai reformulé pour vous Bogdan, veuillez poster votre contenu original en tant que réponse si vous le souhaitez
Rich Seller
on dirait que nous avons modifié en même temps
Rich Seller

Réponses:

145

Pour plus de détails sur la configuration d'un proxy pour Maven, consultez le mini guide .

Vous devez essentiellement vous assurer que la section des proxies dans les paramètres globaux ( [maven install]/conf/settings.xml) ou les paramètres utilisateur ( ${user.home}/.m2/settings.xml) est correctement configurée. Il est préférable de le faire dans vos paramètres utilisateur pour éviter de stocker le mot de passe en texte brut dans un endroit public.

Maven 2.1 a introduit le cryptage des mots de passe , mais je n'ai pas réussi à vérifier si le cryptage s'applique aux paramètres du proxy ainsi qu'aux mots de passe du référentiel (ne voyez pas pourquoi il ne le serait pas).

Pour plus d'informations, il y a une configuration de proxy commentée dans votre settings.xml et des instructions sur la façon de la modifier.

À partir du mini-guide, vos paramètres devraient ressembler à ceci:

<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>
Vendeur riche
la source
Merci, mais ce post est plutôt une astuce pour les autres qu'une question. J'ai déjà résolu ce problème, mais j'ai passé trop de temps à des choses non évidentes. J'ai posté ceci pour que cela puisse être utile à quelqu'un.
Bogdan
7
impossible de trouver le fichier setting.xml dans le répertoire m2. une idée pourquoi? @Rich Seller
Ariox66
5
Vous devez le placer là. Vous pouvez trouver un exemple de settings.xml dans maven_home, l'emplacement où vous avez décompressé les binaires maven.
Ravi
Et si le proxy n'a pas besoin d'authentification, les éléments <username>et <password>doivent être supprimés (et ne pas recevoir de contenu vide). Cela m'a pris un certain temps à comprendre.
dmcontador
50

Comment utiliser un proxy chaussettes?

Configurez un tunnel SSH vers un serveur quelque part:

ssh -D $PORT $USER@$SERVER

Linux (bash):

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

Les fenêtres:

set MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"
gs1
la source
2
L'utilisation d'un proxy Socks MAVEN_OPTSest le seul moyen de faire télécharger Maven via HTTPS. L'utilisation de proxies HTTP ou HTTPS, via MAVEN_OPTSou settings.xml, aboutit àorg.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ă
Pour httpprocuration:export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=$PORT"
Omid
Excellent, merci. Si vous souhaitez utiliser ces options une seule fois pour une seule commande, vous pouvez taper: MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" mvn clean installLes mvncommandes suivantes de la même session seront sans proxy.
Eric Duminil
29

J'ai également eu ce problème et je l'ai résolu en éditant le settings.xmlfichier dans mon .m2dossier. Mon settings.xmlest comme ça maintenant:

<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>
pedrobisp
la source
1
Ce n'est pas le téléchargement de fichiers jar dans mon cas. J'ai tout essayé
Faizan Mubasher
28

Notez également que certains plugins (des ressources distantes viennent à l'esprit) utilisent une très ancienne bibliothèque qui n'accepte que la configuration du proxy via MAVEN_OPTS;

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

Vous pourriez être bloqué sur l'authentification pour celui-ci.

Krosenvold
la source
Cela n'a pas fonctionné pour moi sur Ubuntu 14.04 avec maven 3.0.5 du référentiel Ubuntu. La configuration du proxy dans le fichier settings.xml a fonctionné.
Mihai Capotă
1
A travaillé pour moi sur Ubuntu 14.04 avec Maven 3.0.4
rmv
Un exemple de nécessité de définir MAVEN_OPTS de cette manière est la construction de Maven à partir des sources à l'aide de Maven. Sans MAVEN_OPTS, il ne parvient pas à télécharger LICENSE-2.0, malgré le téléchargement de nombreux JAR.
Permaquid
@krosenvold merci, cette solution a fonctionné pour moi. J'avais déjà défini le proxy dans settings.xml mais il y avait un plugin cxf qui voulait générer le code de wsdl qui échouait. Cela a résolu mon problème.
Vishal Vijayan
23

Pour définir le proxy Maven :

Modifiez la session des proxys dans votre fichier ~ / .m2 / settings.xml . Si vous ne trouvez pas le fichier, créez-en un.

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

ou

Modifiez la session des proxies dans votre {M2_HOME} /conf/settings.xml

J'espère que ça aide.. :)

Sarat Chandra
la source
15

Ceux-ci sont probablement causés par 2 problèmes:

  1. Vous devez ajouter une configuration de proxy à votre settings.xml. Voici une astuce dans le champ de votre nom d'utilisateur. Assurez-vous qu'il ressemble à domaine \ nom d'utilisateur. Il est important de définir le domaine et de mettre cette barre oblique exacte '\'. Vous pouvez utiliser la balise <! [CDATA []]> si votre mot de passe contient des caractères non compatibles XML.
  2. J'ai remarqué que maven 2.2.0 ne fonctionne parfois pas du tout via un proxy, où 2.2.1 fonctionne parfaitement.

Si certains d'entre eux sont omis, maven peut échouer avec des messages d'erreur aléatoires.

J'espère juste que j'ai sauvé quelqu'un de googler autour de ce problème pendant 6 heures, comme je l'ai fait.

Bogdan
la source
Utilisez-vous un proxy NTLM? du mini-guide: "Veuillez noter que [c] urgence, les proxys NTLM ne sont pas pris en charge car ils n'ont pas été testés. Vous pourrez peut-être utiliser les propriétés système appropriées sur JDK 1.4+ pour que cela fonctionne."
Riche vendeur
Pas sûr à ce sujet. C'est un proxy d'entreprise qui est en fait placé à 600 miles de moi et personne de l'administration système n'est en fonction ce week-end. Je ne peux donc demander à personne maintenant. Ce sera intéressant à découvrir. Je sais qu'il prend en charge http, chaussettes et autres protocoles. C'est peut-être aussi NTML.
Bogdan
14

Juste pour ajouter mes propres expériences avec ceci: le proxy de mon entreprise est http://webproxy.intra.companyname.com:3128. Pour que maven fonctionne via ce proxy, les paramètres doivent être exactement comme ça

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

Contrairement à certains autres fichiers de configuration de proxy, le protocolici décrit comment se connecter au serveur proxy, pas quels types de protocole doivent être proxy. La httppartie de la cible doit être séparée du nom d'hôte, sinon cela ne fonctionnera pas.

Andy Jones
la source
A ce moment, je viens d'expérimenter le contraire. Le protocole décrit ici quel protocole doit utiliser ce proxy. Je viens juste de configurer un proxy de protocole https qui se connecte à un proxy http en utilisant <protocol> https </protocol>
Olivier Amblet
Je vous remercie! Cela a fonctionné pour moi! J'avais "http: //" pré-suspendu et cela échouerait
Jesse McCall
11

Merci @krosenvold.

Si les modifications du fichier de paramètres ne fonctionnent pas, essayez ceci dans l'invite de commande contenant le fichier POM.

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

Cela m'a aidé immédiatement après un changement de mot de passe.

user1189363
la source
11

Je lance cntlmlocalement, configuré avec des NTLMv2hachages de mot de passe pour m'authentifier avec le proxy d'entreprise et utiliser

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

pour utiliser ce proxy à partir de maven. Bien sûr, le proxy que vous utilisez doit prendre en charge cntlm/ NTLMv2.

Peter Hofman
la source
`set MAVEN_OPTS = -DproxyHost = 127.0.0.1 -DproxyPort = 3128` pour Windows
qxo
PowerShell peut définir une variable d'environnement système: [Environment]::SetEnvironmentVariable("MAVEN_OPTS", "-DproxyHost=127.0.0.1 -DproxyPort=3128", "Machine")
Boggin
6

Et pour ajouter à ce sujet, voici mes expériences ci-dessous ... Vraiment étrange et chronophage, j'ai donc pensé que cela valait la peine d'être ajouté.

J'ai eu un problème similaire en essayant de construire le pont de portlet sur Windows, obtenant les erreurs suivantes:

Téléchargement: http://repo1.maven.org/maven2/org/apache/portals/bridges-pom/1.0/bridges-pom-1.0.pom
[DEBUG] Lecture du fichier de suivi de la résolution C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[DEBUG] Ecriture du fichier de suivi de résolution C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[ERREUR] La compilation n'a pas pu lire 1 projet -> [Aide 1]
org.apache.maven.project.ProjectBuildingException: certains problèmes ont été rencontrés lors du traitement des POM:
[FATAL] POM parent non résoluble: impossible de transférer l'artefact
org.apache.portals: bridges-pom: pom: 1.0 from / to central (http://repo1.maven.org/maven2): Erreur lors du transfert du fichier: repo1.maven.org et 'parent.relativePath' pointe vers le mauvais local
POM @ ligne 23, colonne 11
...
[ERREUR] Le projet org.apache.portals.bridges: portals-bridges-common: 2.0 (H: \ path_to_project \ portals-bridges-common-2.0 \ pom.xml) a 1 erreur
[ERREUR] POM parent non résoluble: impossible de transférer l'artefact org.apache.portals: bridges-pom: pom: 1.0 de / vers le centre (http://repo1.maven.org/maven2):
Erreur lors du transfert du fichier: repo1.maven.org et 'parent.relativePath' pointe vers un POM local incorrect @ ligne 23, colonne 11: hôte inconnu repo1.maven.org -> [Aide 2]
...
[ERREUR] Pour plus d'informations sur les erreurs et les solutions possibles, veuillez lire les articles suivants:
[ERREUR] [Aide 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERREUR] [Aide 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

J'ai essayé quelques trucs en suivant un peu de surf:

  • J'ai essayé de définir le parent.relativePath comme vide pour que maven ne pense pas que le parent était local. Ceci est conforme à la suggestion sur SO à Hudson build fail: POM parent non résoluble et dans ce forum nabble . Cela n'a eu aucun effet.

  • J'ai également essayé de m'assurer que le référentiel était explicitement répertorié dans mon settings.xml mais cela n'avait aucun effet non plus.

  • Je me suis ensuite assuré que mvn était obligé de rechercher le référentiel, plutôt que de se fier à sa propre histoire, comme indiqué dans ce blog de Sarthon . Malheureusement, ce n'était pas non plus le problème.

  • Dans un certain désespoir, j'ai ensuite revisité mes MAVEN_OPTS pour m'assurer de ne pas tomber sous le coup de mes paramètres de proxy. Celles-ci étaient correctes, mais avec la valeur non citée:

    set MAVEN_OPTS = -Dhttp.proxyHost = monproxy.mycompany.com -Dhttp.proxyPort = 8080 -Xmx256m

  • Donc, enfin, j'ai déplacé la configuration du proxy dans mon settings.xml et cela a fonctionné:

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

Je ne sais vraiment pas pourquoi mon MAVEN_OPTS original ne fonctionnait pas (guillemets?) Alors que la configuration settings.xml fonctionnait. J'aimerais inverser le correctif et vérifier à nouveau chaque étape, mais j'ai perdu trop de temps. Fera rapport au fur et à mesure.

wmorrison365
la source
Avez-vous également spécifié un nom d'utilisateur et un mot de passe dans MAVEN_OPTS?
bcmoney
1
Je ne pense pas que je l'ai fait, mais je n'en ai pas besoin pour mon serveur proxy. Comme vous pouvez le voir, c'est possible. En dehors des problèmes de sécurité, vous pouvez essayer. Je suppose que vous avez encore des problèmes pour être arrivé jusqu'ici?
wmorrison365
4

Je sais que ce n'est pas vraiment une réponse à la question, mais cela vaut peut-être la peine de le savoir pour quelqu'un qui recherche ce post. Il est également possible d'installer un proxy de référentiel Maven comme nexus .

Votre maven serait configuré pour contacter le proxy Nexus local, et Nexus récupérerait alors (et mettrait en cache) les artefacts. Il peut être configuré via une interface Web et prend en charge les proxys (http)).

Cela peut être un avantage, en particulier dans le cadre d'une entreprise, car les artefacts sont disponibles localement et peuvent être téléchargés rapidement, et vous n'êtes plus aussi dépendant de la disponibilité des référentiels Maven externes.

Pour renvoyer à la question; avec Nexus, il existe une belle interface graphique pour la configuration du proxy, et cela doit être fait sur un seul endroit, et pas pour chaque développeur.

extraneon
la source
3

si vous êtes nouveau dans la configuration du proxy pour Maven Dans mon cas, vérifiez d'abord la météo de votre dossier personnel, il y a un .m2dossier et il devrait y avoir un fichier nommé settings.xmlsinon créez-le, collez-le et modifiez-le hostet port, si nécessaire, modifiez lenonProxyHosts

Dossier personnel - C: \ Users \ {UserName}

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

Si dans tous les cas cela ne réussit pas, effectuez les modifications à cet emplacement du dossier d'accueil

/conf/settings.xml

J'utilise Eclipse comme IDE
J'espère que cela vous aidera !!

Remarque: pour supprimer le proxy, déplacez-vous simplement settings.xmlailleurs

Akitha_MJ
la source
Pour supprimer le proxy, déplacez simplement settings.xml vers un autre endroit
Akitha_MJ
1

Si maven fonctionne via un proxy mais pas certains des plugins qu'il invoque, essayez JAVA_TOOL_OPTIONSégalement de -Dhttp*.proxy*définir avec les paramètres.

Si vous JAVA_OPTSvenez de faire

export JAVA_TOOL_OPTIONS=$JAVA_OPTS
Auselen
la source
0

Sauf pour les techniques mentionnées ci-dessus, avec un peu d'effort, vous pouvez exécuter maven via un proxy en utilisant la bibliothèque jproxyloader (il y a un exemple sur la page comment faire cela: http://jproxyloader.sourceforge.net/ ). Cela permet de configurer le proxy socks uniquement pour télécharger des artefacts.

Dans la solution mentionnée par duanni (paramètre -DsocksProxyHost), il y a un problème. Si vous avez des tests d'intégration exécutés sur une base de données locale (ou d'autres tests de connexion à l'URL qui ne devraient pas passer par un proxy). Ces tests cesseront de fonctionner car les connexions à la base de données seront également dirigées vers le proxy. Avec l'aide de jProxyLoader, vous pouvez configurer le proxy uniquement pour l'hôte nexus. De plus, si vous le souhaitez, vous pouvez passer des connexions à la base de données via un autre proxy.

marcheurs
la source
0

Parfois, vous devez ajouter d'autres <proxy></proxy>balises et spécifier le https dans les balises de protocole:<protocol>https</protocol>

Pepe
la source
0

Les messages ci-dessus ont aidé à résoudre mon problème. En plus de ce qui précède, j'ai dû apporter les modifications suivantes pour que cela fonctionne:

  • Modification des paramètres réseau JRE de Maven (\ jre \ lib \ net.properties) pour utiliser le paramètre de proxy système.

    https.proxyHost=proxy DNS
    https.proxyPort=proxy port
  • Paramètres de serveur proxy inclus dans settings.xml. Je n'ai pas fourni de paramètres de nom d'utilisateur et de mot de passe pour utiliser l'authentification NTLM.

siachen345
la source
0

Maven fournit une méthode intégrée pour ce faire, via un fichier appelé settings.xml , et cela a été couvert dans d'autres réponses. Cependant, il est courant, en particulier sous Linux, que les outils de ligne de commande utilisenthttps_proxy automatiquement le proxy spécifié par la variable d'environnement .

Pour suivre le principe Ne vous répétez pas (qui vise à vous aider à éviter les erreurs), ce serait bien simvn pouvait fonctionner automatiquement avec cela aussi.

Voici un script shell qui effectue les conversions nécessaires:

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

Vous pouvez nommer ceci quelque chose comme proxied_mvnet l'exécuter comme:

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

Alternativement, vous pouvez simplement déplacer la configuration de l'environnement dans vos scripts de démarrage.

des pièges

Il y a beaucoup de choses qui peuvent mal tourner lorsque vous essayez de configurer Maven pour accéder à un Nexus via un proxy. Espérons que ce script vous aidera à résoudre certains des problèmes les plus difficiles, mais d'autres restent:

  • Informations d'identification Nexus disponibles et correctes (uniquement si nécessaire)

    Vérifier avec mvn help:effective-settings

  • Mise en cache Maven: "la résolution ne sera pas tentée à nouveau"

    mvn clean package --update-snapshots

  • Sortie de mur de texte Maven - vous devez regarder de près la sortie pour vous assurer que les messages d'erreur ne sont pas subtilement différents entre les exécutions

  • Les anciennes versions de Java peuvent nécessiter _JAVA_OPTIONSau lieu de JAVA_TOOL_OPTIONS.

épilogue

Il existe plus d'un type de proxy . En conséquence, il y a plus d'une façon dont cette question a été interprétée - contribuant au grand nombre de réponses disparates ici.

J'ai explicitement abordé le cas d'un serveur proxy Web (HTTP / HTTPS) , utilisé pour accéder à Internet à partir d'un réseau d'entreprise (pour certaines entreprises). Cela peut être notamment distinct d'un proxy SOCKS , qui a également été abordé dans certaines réponses ici.

Oh au fait, puisqu'elle utilise JAVA_TOOL_OPTIONS, cette solution peut également être appliquée à l' exécution de vos autres applications Java dans un proxy .


Indice de séparation ... Mon exemple ci-dessus utilise http://localhost:58080. C'est parce que j'ai configuré la redirection de port de mon CLIENT_PROXY=localhost:58080au proxy réseau réel en utilisant WSL sur mon client d' accès à distance pour exécuter:

ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY
Brent Bradburn
la source