¿Cómo uso Maven a través de un proxy?

130

Quiero compartir mi experiencia de usar Maven a través de un proxy.

Lo más probable es que enfrentes excepciones y mensajes como:

los metadatos del repositorio para: 'org.apache.maven.plugins' no se pudieron recuperar de 
repositorio: central debido a un error: Error al transferir el archivo: Conexión rechazada: conectar

o

[ADVERTENCIA] Error al recuperar el descriptor del complemento para org.apache.maven.plugins: maven-clean-
plugin: 2.5: Plugin org.apache.maven.plugins: maven-clean-plugin: 2.5 o uno de sus 
no se pudieron resolver las dependencias: no se pudo leer el descriptor de artefactos para 
org.apache.maven.plugins: maven-clean-plugin: jar: 2.5

¿Cómo configurar Maven para usar el servidor proxy?

Bogdan
fuente
(Alguien) ¿Te importaría reformular esto en una pregunta real (como: ¿Cómo uso Maven a través de un proxy?)? A continuación, puede publicar su cuerpo cuestión como una respuesta, para ser más en línea con el formato Stackoverflow ..
Tim
He reformulé por usted Bogdan, por favor, puesto que su contenido original como una respuesta si lo desea
Rich vendedor
Parece que editado al mismo tiempo
Rich Vendedor

Respuestas:

145

Para obtener detalles sobre cómo configurar un proxy para Maven, consulte la mini guía .

Esencialmente, debe asegurarse de que la sección proxies en la configuración global ( [maven install]/conf/settings.xml) o en la configuración del usuario ( ${user.home}/.m2/settings.xml) esté configurada correctamente. Es mejor hacer esto en la configuración de usuario para evitar almacenar la contraseña en texto plano en una ubicación pública.

Maven 2.1 introdujo el cifrado de contraseña , pero no he podido comprobar si el cifrado se aplica a la configuración del proxy, así como a las contraseñas del repositorio (no veo por qué no lo haría).

Para obtener información, hay una configuración de proxy comentada en settings.xml e instrucciones sobre cómo modificarla.

Desde la mini-guía, su configuración debería verse así:

<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>
Vendedor rico
fuente
Gracias, pero esta publicación es más un consejo para otros que una pregunta. Ya he resuelto este problema, pero pasé demasiado tiempo en cosas no obvias. Publiqué esto para que pueda ser útil para alguien.
Bogdan
77
no se puede encontrar el archivo setting.xml en el directorio m2. alguna idea de por qué? @Rich Seller
Ariox66
55
Tienes que colocarlo allí. Puede encontrar un ejemplo de settings.xml de maven_home, la ubicación donde descomprimió los binarios de maven.
Ravi
Y si el proxy no necesita autenticación, los elementos <username>y <password>deben eliminarse (y no se deben dar contenidos vacíos). Esto me llevó un tiempo darme cuenta.
dmcontador
50

¿Cómo usar un proxy de calcetines?

Configure un túnel SSH para un servidor en algún lugar:

ssh -D $PORT $USER@$SERVER

Linux (bash):

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

Ventanas:

set MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"
gs1
fuente
2
Usar un proxy de calcetines MAVEN_OPTSes la única forma en que puedo hacer que Maven descargue a través de HTTPS. El uso de servidores proxy HTTP o HTTPS, ya sea a través de MAVEN_OPTSo settings.xml, da como resultadoorg.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ă
Para httpproxy:export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=$PORT"
Omid el
Excelente, gracias. Si desea utilizar esas opciones solo una vez para un solo comando, puede escribir: MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" mvn clean installLos siguientes mvncomandos en la misma sesión serán sin ningún proxy.
Eric Duminil
29

También tuve este problema y lo resolví editando el settings.xmlarchivo en mi .m2carpeta. Mi settings.xmles así ahora:

<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
fuente
1
Esto no es descargar archivos jar en mi caso. He intentado todo
Faizan Mubasher
28

También tenga en cuenta que algunos complementos (me vienen a la mente los recursos remotos) usan una biblioteca realmente antigua que solo acepta la configuración del proxy a través de MAVEN_OPTS;

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

Puede que esté atascado en la autenticación para este.

krosenvold
fuente
No funcionó para mí en Ubuntu 14.04 con maven 3.0.5 del repositorio de Ubuntu. Configurar el proxy en el archivo settings.xml funcionó.
Mihai Capotă
1
Trabajó para mí en Ubuntu 14.04 con Maven 3.0.4
rmv
Un ejemplo de la necesidad de configurar MAVEN_OPTS de esta manera es construir Maven desde la fuente usando Maven. Sin MAVEN_OPTS, no puede descargar LICENSE-2.0, a pesar de descargar muchos JAR.
Permaquid
@krosenvold gracias, esta solución funcionó para mí. Ya había configurado el proxy en settings.xml pero había un complemento cxf que quería generar el código de wsdl que estaba fallando. Esto solucionó mi problema.
Vishal Vijayan
23

Para configurar el Proxy Maven :

Edite la sesión de proxy en su archivo ~ / .m2 / settings.xml . Si no puede encontrar el archivo, cree 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

Edite la sesión de proxy en su {M2_HOME} /conf/settings.xml

Espero eso ayude.. :)

Sarat Chandra
fuente
15

Esos son probablemente causados ​​por 2 problemas:

  1. Debe agregar la configuración de proxy a su settings.xml. Aquí hay un truco en su campo de nombre de usuario. Asegúrese de que se vea como dominio \ nombre de usuario. Establecer el dominio allí y poner esta barra diagonal exacta es importante '\'. Es posible que desee utilizar la etiqueta <! [CDATA []]> si su contraseña contiene caracteres no compatibles con xml.
  2. He notado que maven 2.2.0 a veces no funciona a través de un proxy, donde 2.2.1 funciona perfectamente bien.

Si se omiten algunos de ellos, Maven podría fallar con mensajes de error aleatorios.

Solo espero haber salvado a alguien de buscar en Google este problema durante 6 horas, como lo hice.

Bogdan
fuente
¿Estás usando un proxy NTLM? de la mini guía: "Tenga en cuenta que [c] actualmente los servidores proxy NTLM no son compatibles ya que no han sido probados. Es posible que pueda usar las propiedades relevantes del sistema en JDK 1.4+ para que esto funcione".
Vendedor rico
No estoy seguro de esto. Ese es un proxy corporativo que en realidad está ubicado a 600 millas de mí y nadie de la administración del sistema está en el cargo este fin de semana. Así que no puedo preguntarle a nadie ahora. Será interesante averigüarlo. Sé que es compatible con http, calcetines y otros protocolos. Quizás también sea NTML.
Bogdan
14

Solo para agregar mis propias experiencias con esto: el proxy de mi empresa es http://webproxy.intra.companyname.com:3128. Para que maven funcione a través de este proxy, la configuración debe ser exactamente así

<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 diferencia de otros archivos de configuración de proxy, protocolaquí se describe cómo conectarse al servidor proxy, no qué tipos de protocolo se deben proxy. La httpparte del objetivo debe separarse del nombre de host, de lo contrario no funcionará.

Andy Jones
fuente
En este momento solo experimenté lo contrario. El protocolo aquí es describir qué protocolo debe usar este proxy. Acabo de lograr configurar un proxy de protocolo https que se conecta a un proxy http usando <protocol> https </protocol>
Olivier Amblet
¡Gracias! ¡Esto funcionó para mí! Tenía "http: //" pre-pendiente y fallaría
Jesse McCall
11

Gracias @krosenvold.

Si los cambios en el archivo de configuración no funcionan, intente esto en el símbolo del sistema que tiene el archivo POM.

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

Esto me ha ayudado inmediatamente después de un cambio de contraseña.

usuario1189363
fuente
11

Corro cntlmnecesitas cigarros, configurado con NTLMv2los hashes de contraseñas para la autenticación con el servidor proxy corporativo, y el uso

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

para usar ese proxy de maven. Por supuesto, el proxy que use debe ser compatible con cntlm/ NTLMv2.

Peter Hofman
fuente
`set MAVEN_OPTS = -DproxyHost = 127.0.0.1 -DproxyPort = 3128` para windows
qxo
PowerShell puede establecer una variable de entorno del sistema: [Environment]::SetEnvironmentVariable("MAVEN_OPTS", "-DproxyHost=127.0.0.1 -DproxyPort=3128", "Machine")
Boggin
6

Y para agregar a este tema, aquí están mis experiencias a continuación ... Realmente extraño y lento, así que pensé que valía la pena agregarlo.

Tuve un problema similar al intentar construir el portlet-bridge en Windows, obteniendo los siguientes errores:

Descargando: http://repo1.maven.org/maven2/org/apache/portals/bridges-pom/1.0/bridges-pom-1.0.pom
[DEPURACIÓN] Lectura del archivo de seguimiento de resolución C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[DEPURACIÓN] Archivo de seguimiento de resolución de escritura C: \ Documents and Settings \ myuser \ .m2 \ repository \ org \ apache \ portals \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[ERROR] La compilación no pudo leer 1 proyecto -> [Ayuda 1]
org.apache.maven.project.ProjectBuildingException: se encontraron algunos problemas al procesar los POM:
[FATAL] POM principal no resuelto: no se pudo transferir el artefacto
org.apache.portals: bridges-pom: pom: 1.0 from / to central (http://repo1.maven.org/maven2): Error al transferir el archivo: repo1.maven.org y 'parent.relativePath' apunta a un local incorrecto
POM @ línea 23, columna 11
...
[ERROR] El proyecto org.apache.portals.bridges: portals-bridges-common: 2.0 (H: \ path_to_project \ portals-bridges-common-2.0 \ pom.xml) tiene 1 error
[ERROR] POM padre no resoluble: No se pudo transferir el artefacto org.apache.portals: bridges-pom: pom: 1.0 desde / a central (http://repo1.maven.org/maven2):
Error al transferir el archivo: repo1.maven.org y 'parent.relativePath' apunta a un POM local incorrecto @ línea 23, columna 11: Host desconocido repo1.maven.org -> [Ayuda 2]
...
[ERROR] Para obtener más información sobre los errores y las posibles soluciones, lea los siguientes artículos:
[ERROR] [Ayuda 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Ayuda 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

Intenté un par de cosas, luego de surfear un poco:

  • Intenté establecer parent.relativePath como vacío para que maven no pensara que el padre era local. Esto es según la sugerencia de SO en la falla de compilación de Hudson: POM padre no resoluble y en este foro molesto . Esto no tuvo efecto.

  • También intenté asegurarme de que el repositorio apareciera explícitamente en mi settings.xml, pero esto tampoco tuvo ningún efecto.

  • Luego me aseguré de que mvn se viera obligado a buscar el repositorio, en lugar de confiar en su propia historia, como se discutió en este blog de Sarthon . Desafortunadamente, este tampoco era el problema.

  • En cierta desesperación, volví a visitar mis MAVEN_OPTS para asegurarme de que no estaba fallando en mi configuración de proxy. Estos fueron correctos, aunque con el valor sin comillas:

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

  • Entonces, finalmente, moví la configuración del proxy a mi settings.xml y funcionó:

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

Realmente no estoy seguro de por qué mi MAVEN_OPTS original no funcionaba (¿comillas?) Mientras que la configuración settings.xml sí funcionaba. Me gustaría revertir la solución y verificar cada paso nuevamente, pero he perdido demasiado tiempo. Informará de nuevo cuando y cuando.

wmorrison365
fuente
¿En realidad también especificó un nombre de usuario y contraseña en MAVEN_OPTS?
bcmoney
1
No creo que lo haya hecho, pero no es necesario para mi servidor proxy. Sin embargo, como puede ver, es posible. Además de los problemas de seguridad, puede intentarlo. Supongo que todavía tienes problemas para llegar tan lejos.
wmorrison365
4

Sé que esto no es realmente una respuesta a la pregunta, pero podría valer la pena saberlo para alguien que busque esta publicación. También es posible instalar un proxy de repositorio Maven como nexus .

Su experto se configuraría para contactar al proxy local de Nexus, y Nexus luego recuperaría (y guardaría en caché) los artefactos. Se puede configurar a través de una interfaz web y tiene soporte para servidores proxy (http).

Esto puede ser una ventaja, especialmente en una empresa, ya que los artefactos están disponibles localmente y se pueden descargar rápidamente, y ya no depende tanto de la disponibilidad de repositorios externos de Maven.

Para vincular de nuevo a la pregunta; Con Nexus hay una buena GUI para la configuración del proxy, y debe hacerse en un solo lugar, y no para todos los desarrolladores.

extraneon
fuente
3

si eres nuevo en la configuración del proxy para Maven En mi caso, primero ve y comprueba el clima de tu carpeta de inicio, hay una .m2carpeta y en ella debe haber un archivo llamado settings.xmlsi no lo creas, y pega esto y cambia hosty port, si es necesario, cambia elnonProxyHosts

Carpeta de inicio - 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>

En cualquier caso, esto no tiene éxito, vaya y haga los cambios en esta ubicación de la carpeta de inicio

/conf/settings.xml

Estoy usando Eclipse como mi IDE ¡
Espero que esto ayude!

Nota: para eliminar el proxy, simplemente muévase settings.xmla otro lugar

Akitha_MJ
fuente
Para eliminar el proxy, simplemente mueva settings.xml a otro lugar
Akitha_MJ
1

Si Maven funciona a través del proxy pero no algunos de los complementos que está invocando, intente configurarlo JAVA_TOOL_OPTIONStambién con la -Dhttp*.proxy*configuración.

Si ya lo JAVA_OPTSacabas de hacer

export JAVA_TOOL_OPTIONS=$JAVA_OPTS
Auselen
fuente
0

Excepto por las técnicas mencionadas anteriormente, con algo de esfuerzo, puede ejecutar maven a través de proxy utilizando la biblioteca jproxyloader (hay un ejemplo en la página de cómo hacer esto: http://jproxyloader.sourceforge.net/ ). Esto permite configurar proxy de calcetines solo para descargar artefactos.

En la solución mencionada por duanni (configuración -DsocksProxyHost) hay un problema. Si tiene pruebas de integración que se ejecutan en la base de datos local (u otras pruebas que se conectan a la URL, que no deberían pasar por proxy). Estas pruebas dejarán de funcionar porque las conexiones a la base de datos también se dirigirán al proxy. Con la ayuda de jProxyLoader, puede configurar el proxy solo para el host nexus. Además, si lo desea, puede pasar las conexiones a la base de datos a través de otro proxy.

walkeros
fuente
0

Algunas veces necesita agregar otras <proxy></proxy>etiquetas y especificar las https en las etiquetas de protocolo:<protocol>https</protocol>

Pepe
fuente
0

Las publicaciones anteriores ayudaron a resolver mi problema. Además de lo anterior, tuve que hacer los siguientes cambios para que funcionara:

  • Se modificó la configuración de red JRE de Maven (\ jre \ lib \ net.properties) para usar la configuración de proxy del sistema.

    https.proxyHost=proxy DNS
    https.proxyPort=proxy port
  • Configuración del servidor proxy incluida en settings.xml. No proporcioné configuraciones de nombre de usuario y contraseña para usar la autenticación NTLM.

siachen345
fuente
0

Maven proporciona un método incorporado para hacerlo, a través de un archivo llamado settings.xml , y esto se ha cubierto en otras respuestas. Sin embargo, es habitual, particularmente en Linux, que las herramientas de línea de comandos usenhttps_proxy automáticamente el proxy especificado por la variable de entorno .

Para seguir el principio de No repetirse (que está destinado a ayudarlo a evitar errores), sería bueno que también mvnpudiera funcionar automáticamente con eso.

Aquí hay un script de shell que realiza las conversiones necesarias:

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

Puede llamar a esto algo así proxied_mvny ejecutarlo como:

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

Alternativamente, puede mover la configuración del entorno a sus scripts de inicio.

gotchas

Hay muchas cosas que pueden salir mal al intentar configurar Maven para acceder a un Nexus a través de un proxy. Con suerte, este script ayudará con algunos de los problemas más delicados, pero otros permanecen:

  • Credenciales de Nexus disponibles y correctas (solo si es necesario)

    Comprueba con mvn help:effective-settings

  • Almacenamiento en caché de Maven: "la resolución no se volverá a intentar"

    mvn clean package --update-snapshots

  • Salida de muro de texto de Maven: debe observar detenidamente la salida para asegurarse de que los mensajes de error no sean sutilmente diferentes entre las ejecuciones

  • Las versiones anteriores de Java pueden requerir en _JAVA_OPTIONSlugar de JAVA_TOOL_OPTIONS.

epílogo

Hay más de un tipo de Proxy . En consecuencia, hay más de una forma de interpretar esta pregunta, lo que contribuye a la gran cantidad de respuestas dispares aquí.

He abordado explícitamente el caso de un servidor proxy web (reenvío HTTP / HTTPS) , que se utiliza para acceder a Internet desde la red de una empresa (para algunas empresas). Esto puede ser notablemente diferente de un proxy SOCKS , que también se ha abordado en algunas respuestas aquí.

Ah, por cierto, dado que usa JAVA_TOOL_OPTIONS, estas soluciones también se pueden aplicar para ejecutar sus otras aplicaciones Java dentro de un proxy .


Sugerencia de despedida ... Mi ejemplo anterior usa http://localhost:58080. Esto se debe a que configuré el reenvío de puertos desde mi CLIENT_PROXY=localhost:58080proxy de red real al usar WSL en mi cliente de acceso remoto para ejecutar:

ssh $PROXY_CLIENT -R $CLIENT_PROXY:$SERVER_PROXY
Brent Bradburn
fuente