Como uso o Maven através de um proxy?

130

Quero compartilhar minha experiência de usar o maven por meio de um proxy.

Você provavelmente enfrentaria exceções e mensagens como:

os metadados do repositório para: 'org.apache.maven.plugins' não puderam ser recuperados de 
repositório: central devido a um erro: Erro ao transferir arquivo: Conexão recusada: conectar

ou

[AVISO] Falha ao recuperar o descritor de plug-in para org.apache.maven.plugins: maven-clean-
plugin: 2.5: Plugin org.apache.maven.plugins: maven-clean-plugin: 2.5 ou um de seus 
dependências não puderam ser resolvidas: falha ao ler o descritor de artefato para 
org.apache.maven.plugins: maven-clean-plugin: jar: 2.5

Como configurar o Maven para usar o servidor proxy?

Bogdan
fonte
(Alguém) Mente reformular isso em uma pergunta real (como: como uso o Maven por meio de um proxy?)? Você poderia, então, postar seu corpo pergunta como resposta, para ser mais em linha com o formato StackOverflow ..
Tim
Eu reformulada para você Bogdan, por favor poste o seu conteúdo original como uma resposta, se desejar
Rich Seller
Parece que nós editadas ao mesmo tempo
Rich Seller

Respostas:

145

Para detalhes sobre como configurar um proxy para o Maven, consulte o mini guia .

Essencialmente, você precisa garantir que a seção proxies nas configurações globais ( [maven install]/conf/settings.xml) ou nas configurações do usuário ( ${user.home}/.m2/settings.xml) esteja configurada corretamente. É melhor fazer isso nas configurações do usuário para evitar o armazenamento da senha em texto sem formatação em um local público.

O Maven 2.1 introduziu a criptografia de senha , mas não cheguei a verificar se a criptografia se aplica às configurações de proxy e às senhas do repositório (não veja por que não seria).

Para obter informações, há uma configuração de proxy comentada em seu settings.xml e instruções sobre como modificá-la.

No mini-guia, suas configurações devem ser algo assim:

<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
fonte
Obrigado, mas este post é mais uma dica para os outros do que uma pergunta. Eu já resolvi esse problema, mas gastei muito tempo com coisas não óbvias. Eu postei isso para que possa ser útil para alguém.
9459 Bogdan
7
Não é possível encontrar o arquivo setting.xml no diretório m2. alguma idéia do porquê? @Rich Seller
Ariox66
5
Você tem que colocá-lo lá. Você pode encontrar um exemplo settings.xml em maven_home, o local em que você descompactou os binários do maven.
Ravi
E se o proxy não precisar de autenticação, os elementos <username>e <password>devem ser removidos (e não receber conteúdo vazio). Demorei um pouco para descobrir.
dmcontador 28/08/19
50

Como usar um proxy de meias?

Configure um túnel SSH para um servidor em algum lugar:

ssh -D $PORT $USER@$SERVER

Linux (bash):

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

Janelas:

set MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=$PORT"
gs1
fonte
2
Usar um proxy de meias MAVEN_OPTSé a única maneira de fazer o Maven fazer o download por HTTPS. O uso de proxies HTTP ou HTTPS, por meio MAVEN_OPTSou settings.xmlresulta emorg.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 Cap 8/16
Para httpproxy:export MAVEN_OPTS="-DproxyHost=127.0.0.1 -DproxyPort=$PORT"
Omid
Excelente, obrigado. Se você quiser usar essas opções apenas uma vez para um único comando, poderá digitar: MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" mvn clean installOs próximos mvncomandos na mesma sessão serão sem proxy.
Eric Duminil
29

Eu também tive esse problema e resolvi-o editando o settings.xmlarquivo na minha .m2pasta. Meu settings.xmlé assim agora:

<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
fonte
1
Isso não está baixando arquivos jar no meu caso. Eu tentei de tudo #
Faizan Mubasher
28

Observe também que alguns plug-ins (recursos remotos vêm à mente) usam uma biblioteca muito antiga que aceita apenas configurações de proxy através do MAVEN_OPTS;

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

Você pode estar preso na autenticação para este.

krosenvold
fonte
Não funcionou para mim no Ubuntu 14.04 com maven 3.0.5 do repositório Ubuntu. A configuração do proxy no arquivo settings.xml funcionou.
Mihai Capotă 10/09/15
1
Trabalhou para mim no Ubuntu 14.04 com Maven 3.0.4
rmv 30/03
Um exemplo da necessidade de definir MAVEN_OPTS dessa maneira é criar o Maven a partir da fonte usando o Maven. Sem o MAVEN_OPTS, ele falha ao baixar o LICENSE-2.0, apesar de baixar muitos JARs.
31917 Permaquid
@krosenvold obrigado, esta solução funcionou para mim. Eu já havia definido o proxy em settings.xml, mas havia um plug-in cxf que queria gerar o código a partir do wsdl que estava falhando. Isso resolveu o meu problema.
Vishal Vijayan
23

Para definir o Maven Proxy :

Edite a sessão de proxies no seu arquivo ~ / .m2 / settings.xml . Se você não conseguir encontrar o arquivo, crie um.

<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

Edite a sessão de proxies em seu {M2_HOME} /conf/settings.xml

Espero que ajude.. :)

Sarat Chandra
fonte
15

Isso é causado provavelmente por 2 problemas:

  1. Você precisa adicionar a configuração de proxy ao seu settings.xml. Aqui está um truque no seu campo de nome de usuário. Verifique se ele se parece com domínio \ nome de usuário. Definir o domínio e colocar essa barra exata é importante '\'. Você pode usar a tag <! [CDATA []]> se sua senha contiver caracteres não compatíveis com xml.
  2. Notei que o maven 2.2.0 às vezes não funciona através de um proxy, onde o 2.2.1 funciona perfeitamente bem.

Se alguns deles forem omitidos - o maven poderá falhar com mensagens de erro aleatórias.

Espero que eu tenha salvado alguém de pesquisar no Google por 6 horas, como eu fiz.

Bogdan
fonte
Você está usando um proxy NTLM? no mini guia: "Observe que os proxies NTLM [c] não são suportados porque não foram testados. Você pode usar as propriedades relevantes do sistema no JDK 1.4+ para fazer isso funcionar".
Rich Seller
Não tenho certeza sobre isso. Esse é um proxy corporativo que está localizado a 600 milhas de mim e ninguém da administração do sistema está no cargo neste fim de semana. Então não posso perguntar a ninguém agora. Vai ser interessante descobrir. Eu sei que ele suporta http, meias e outros protocolos. Talvez seja NTML também.
Bogdan
14

Só para adicionar minhas próprias experiências com isso: o proxy da minha empresa é http://webproxy.intra.companyname.com:3128. Para que o maven funcione através desse proxy, as configurações devem ser exatamente assim

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

Diferentemente de outros arquivos de configuração de proxy, o protocolaqui descreve como conectar-se ao servidor proxy, e não quais tipos de protocolo devem ser proxy. A httpparte do destino deve ser separada do nome do host, caso contrário não funcionará.

Andy Jones
fonte
Nesse momento, experimentei o contrário. O protocolo aqui é para descrever qual protocolo deve usar esse proxy. Eu só conseguido para configurar um proxy HTTPS protocolo que se conectam a um proxy HTTP, usando <protocol> https </ protocolo>
Olivier Amblet
Obrigado! Isso funcionou para mim! Eu tinha "http: //" pré-pendente e que iria falhar
Jesse McCall
11

Obrigado @krosenvold.

Se as alterações no arquivo de configurações não funcionarem, tente isso no prompt de comando com o arquivo POM.

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

Isso me ajudou imediatamente após uma alteração de senha.

user1189363
fonte
11

Eu corro cntlmlocalmente, configurado com NTLMv2hashes de senha para autenticar com o proxy corporativo e uso

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

para usar esse proxy de maven. Claro que o proxy que você usa deve suportar cntlm/ NTLMv2.

Peter Hofman
fonte
`` set MAVEN_OPTS = -DproxyHost = 127.0.0.1 -DproxyPort = 3128 `para windows
qxo
O PowerShell pode definir uma variável de ambiente do sistema: [Environment]::SetEnvironmentVariable("MAVEN_OPTS", "-DproxyHost=127.0.0.1 -DproxyPort=3128", "Machine")
Boggin
6

E para adicionar a este tópico, aqui estão minhas experiências abaixo ... Realmente estranhas e demoradas, então pensei que valeria a pena adicionar.

Eu tive um problema semelhante ao tentar criar a ponte de portlet no Windows, obtendo os seguintes erros:

Download: http://repo1.maven.org/maven2/org/apache/portals/bridges-pom/1.0/bridges-pom-1.0.pom
[DEBUG] Lendo o arquivo de rastreamento de resolução C: \ Documents and Settings \ meu usuário \ .m2 \ repositório \ org \ apache \ portais \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[DEBUG] Escrevendo o arquivo de rastreamento de resolução C: \ Documents and Settings \ meu usuário \ .m2 \ repositório \ org \ apache \ portais \ bridges-pom \ 1.0 \ bridges-pom-1.0.pom.lastUpdated
[ERRO] A compilação não pôde ler 1 projeto -> [Ajuda 1]
org.apache.maven.project.ProjectBuildingException: foram encontrados alguns problemas ao processar as POMs:
[FATAL] POM pai não resolvível: não foi possível transferir o artefato
org.apache.portals: bridges-pom: pom: 1.0 da / para a central (http://repo1.maven.org/maven2): Erro ao transferir o arquivo: repo1.maven.org e 'parent.relativePath' aponta para local errado
POM @ linha 23, coluna 11
...
[ERRO] O projeto org.apache.portals.bridges: portals-bridges-common: 2.0 (H: \ path_to_project \ portals-bridges-common-2.0 \ pom.xml) possui 1 erro
[ERRO] POM pai não resolvível: não foi possível transferir o artefato org.apache.portals: bridges-pom: pom: 1.0 da / para a central (http://repo1.maven.org/maven2):
Erro ao transferir o arquivo: repo1.maven.org e 'parent.relativePath' aponta para POM local errado na linha 23, coluna 11: host desconhecido repo1.maven.org -> [Ajuda 2]
...
[ERRO] Para obter mais informações sobre os erros e possíveis soluções, leia os seguintes artigos:
[ERRO] [Ajuda 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERRO] [Ajuda 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

Eu tentei algumas coisas, seguindo um pouco de surf:

  • Tentou definir o parent.relativePath como vazio, para que o maven não pensasse que o pai era local. Isso ocorre de acordo com a sugestão de SO no Hudson: falha de compilação: POM pai não resolvível e neste fórum nabble . Isso não teve efeito.

  • Também tentei garantir que o repositório estivesse listado explicitamente em meu settings.xml, mas isso também não teve efeito.

  • Em seguida, assegurei que o mvn fosse forçado a procurar no repositório, em vez de confiar em sua própria história, conforme discutido neste blog por Sarthon . Infelizmente, esse também não era o problema.

  • Em algum desespero, revisitei meu MAVEN_OPTS para garantir que não estivesse afetando minhas configurações de proxy. Eles estavam corretos, embora com o valor não citado:

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

  • Então, finalmente, mudei a configuração do proxy para o meu settings.xml e funcionou:

    <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 não sei por que meu MAVEN_OPTS original não estava funcionando (aspas?) Enquanto a configuração settings.xml funcionou. Gostaria de reverter a correção e verificar cada etapa novamente, mas perdi muito tempo. Irá relatar como e quando.

wmorrison365
fonte
Você também especificou um nome de usuário e senha no MAVEN_OPTS?
precisa saber é o seguinte
1
Acho que não, mas não preciso do meu servidor proxy. Como você pode ver, é possível. Além dos problemas de segurança, você pode tentar. Acho que você ainda está tendo problemas para chegar até aqui, então?
precisa saber é o seguinte
4

Eu sei que isso não é realmente uma resposta para a pergunta, mas pode valer a pena saber para alguém que está pesquisando neste post. Também é possível instalar um proxy de repositório Maven como o nexus .

Seu maven seria configurado para entrar em contato com o proxy local do Nexus, e o Nexus recuperaria (e armazenaria em cache) os artefatos. Ele pode ser configurado através de uma interface da web e possui suporte para proxies (http).

Isso pode ser uma vantagem, especialmente em uma empresa, pois os artefatos estão disponíveis localmente e podem ser baixados rapidamente, e você não depende mais da disponibilidade de repositórios externos do Maven.

Para vincular de volta à pergunta; com o Nexus, existe uma boa interface gráfica para a configuração do proxy, e ela precisa ser feita em um único local, e não para todos os desenvolvedores.

extraneon
fonte
3

se você é novo na configuração de proxy para o Maven No meu caso, vá primeiro e verifique o clima da pasta pessoal. Há uma .m2pasta e deve haver um arquivo com o nome settings.xmlse não for criado, cole-o e altere-o hoste port, se necessário, altere ononProxyHosts

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

Se, em qualquer caso, isso não der certo, faça as alterações neste local da Pasta Pessoal.

/conf/settings.xml

Estou usando o Eclipse como meu IDE
Espero que isso ajude !!

Nota: Para remover o proxy, vá settings.xmlpara algum outro lugar

Akitha_MJ
fonte
Para remover o proxy, basta mover o
arquivo
1

Se o maven funciona através de proxy, mas não de alguns dos plugins que ele está chamando, tente configurar JAVA_TOOL_OPTIONStambém com as -Dhttp*.proxy*configurações.

Se você já JAVA_OPTSacabou de fazer

export JAVA_TOOL_OPTIONS=$JAVA_OPTS
auselen
fonte
0

Exceto pelas técnicas mencionadas acima, com algum esforço, você pode executar o maven por meio do proxy usando a biblioteca jproxyloader (há um exemplo na página de como fazer isso: http://jproxyloader.sourceforge.net/ ). Isso permite configurar o proxy de meias apenas para fazer o download de artefatos.

Na solução mencionada por duanni (configurando -DsocksProxyHost), há um problema. Se você tiver testes de integração em execução no banco de dados local (ou outros testes que se conectem ao URL, que não devem passar por proxy). Esses testes deixarão de funcionar porque as conexões com o banco de dados também serão direcionadas ao proxy. Com a ajuda do jProxyLoader, você pode configurar o proxy apenas para o host do nexus. Além disso, se você quiser, pode passar as conexões ao banco de dados através de outro proxy.

walkeros
fonte
0

Algumas vezes você precisa adicionar outras <proxy></proxy>tags e especificar o https nas tags de protocolo:<protocol>https</protocol>

Pepe
fonte
0

As postagens acima ajudaram a resolver meu problema. Além do que foi dito acima, tive que fazer as seguintes alterações para que funcionasse:

  • As configurações de rede do JRE do Maven modificadas (\ jre \ lib \ net.properties) para usar a configuração de proxy do sistema.

    https.proxyHost=proxy DNS
    https.proxyPort=proxy port
  • Configurações de servidor proxy incluídas em settings.xml. Não forneci configurações de nome de usuário e senha para usar a autenticação NTLM.

siachen345
fonte
0

O Maven fornece um método interno para fazer isso, por meio de um arquivo chamado settings.xml , e isso foi abordado em outras respostas. No entanto, é habitual, especialmente no Linux, que as ferramentas de linha de comando usemhttps_proxy automaticamente o proxy especificado pela variável de ambiente .

Para seguir o princípio Não se repita (que se destina a ajudá-lo a evitar erros), seria bom se também mvnpudesse trabalhar automaticamente com isso.

Aqui está um script de shell que faz as conversões necessárias:

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

Você pode nomear algo assim proxied_mvne executá-lo como:

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

Como alternativa, você pode simplesmente mover a configuração do ambiente para seus scripts de inicialização.

Pegadinhas

Há muitas coisas que podem dar errado ao tentar configurar o Maven para acessar um Nexus por meio de um proxy. Felizmente, este script ajudará com alguns dos problemas mais complicados, mas outros permanecem:

  • Credenciais do Nexus disponíveis e corretas (somente se necessário)

    Verificar com mvn help:effective-settings

  • Cache do Maven: "a resolução não será tentada novamente"

    mvn clean package --update-snapshots

  • Saída de parede de texto do Maven - você precisa observar atentamente a saída para garantir que as mensagens de erro não sejam sutilmente diferentes entre as execuções

  • Versões mais antigas do Java podem exigir em _JAVA_OPTIONSvez de JAVA_TOOL_OPTIONS.

epílogo

Há mais de um tipo de proxy . Correspondentemente, há mais de uma maneira pela qual essa pergunta foi interpretada - contribuindo para o grande número de respostas díspares aqui.

Abordei explicitamente o caso de um servidor proxy da Web (HTTP / HTTPS) , usado para acessar a Internet a partir de uma rede da empresa (para algumas empresas). Isso pode ser notavelmente diferente de um proxy SOCKS , que também foi abordado em algumas respostas aqui.

Ah, a propósito, uma vez que ele usa JAVA_TOOL_OPTIONS, essas soluções também podem ser aplicadas à execução de outros aplicativos Java dentro de um proxy .


Dica de partição ... Meu exemplo acima usa http://localhost:58080. Isso ocorre porque eu configurei o encaminhamento de porta do meu CLIENT_PROXY=localhost:58080para o proxy de rede real usando o WSL no meu cliente de acesso remoto para executar:

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