Configuração de proxy Gradle

159

Preciso de acesso à web da Gradle por meio de um servidor proxy para usar a integração da Gradle / Artifactory para o Jenkins. Para reduzir possíveis causas de problemas, adiciono manualmente o plug-in Artifactory em build.gradle e o executo na linha de comando:

apply {
    apply from: "http://gradle.artifactoryonline.com/gradle/plugins/org/jfrog/buildinfo/build-info-extractor-gradle/1.0.1/artifactoryplugin-1.0.1.gradle"
}

Após esta descrição, especifiquei o seguinte em .gradle / gradle.properties no meu diretório pessoal:

systemProp.http.proxyHost=hostname
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=de\\username
systemProp.http.proxyPassword=xxx

Com a configuração de proxy acima (que é conhecida por funcionar), ela falha:

11: 33: 17.699 [ERRO] [org.gradle.BuildExceptionReporter] Causado por: java.io.IOException: O servidor retornou o código de resposta HTTP: 407 para o URL: http://gradle.artifactoryonline.com/gradle/plugins/org/ jfrog / buildinfo / build-info-extractor-gradle / 1.0.1 / artifactoryplugin-1.0.1.gradle

Eu tenho dois servidores proxy para escolher e um sempre responde com 407( autenticação de proxy necessária ), o outro com 502( gateway incorreto); portanto, obviamente, as opções proxyHost e proxyPort são usadas.

Como o nome de usuário (com base em um usuário do Active Directory) contém uma barra invertida, tentei ambos \\e \, mas nenhum funcionou. O usuário especificado é diferente do usuário conectado à máquina e ao Active Directory. As credenciais deste usuário não são válidas para o proxy, portanto, preciso poder especificar um usuário diferente.

Definir as mesmas opções na GUI de Jenkins ou Artifactory funcionou.

Daniel Beck
fonte
1
tendo o mesmo problema, nenhuma das respostas aqui ajudou (mesmo as que seguem os métodos obsoletos / não obsoletos). então eu percebi https procuração deve ser definido: stackoverflow.com/a/27686730/1024839
hkoosha
Você deve olhar para este URL, mais completo e atualizado (com http e https): docs.gradle.org/current/userguide/…
Guillaume Husta
@GuillaumeHusta Obrigado, mas observe que esta pergunta foi publicada há mais de 5 anos, quando o Gradle 0.8 foi a versão mais recente, e a documentação sobre isso estava completamente errada (veja minha própria resposta a esta pergunta).
Daniel Beck
Eu tive esse problema ao usar aspas no proxy, use systemProp.http.proxyHost = xyz não systemProp.http.proxyHost = 'xyz'
ir2pid

Respostas:

211

Refinamento sobre a resposta de Daniel:

Configuração de proxy somente HTTP

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

Configuração somente de HTTPS Proxy

gradlew -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

Configuração de proxy HTTP e HTTPS

gradlew -Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3129 "-Dhttp.nonProxyHosts=*.nonproxyrepos.com|localhost"

Configuração de proxy com usuário e senha

gradlew -Dhttp.proxyHost = 127.0.0.1 -Dhttp.proxyPort = 3128 - Dhttps.proxyHost = 127.0.0.1 -Dhttps.proxyPort = 3129 -Dhttps.proxyUser = usuário -Dhttps.proxyPassword = user -Dhttp.proxyPort proxyPassword = passar -Dhttp.nonProxyHosts = host1.com | host2.com

trabalhou para mim (com gradle.propertieshomedir ou dir de projeto, a construção ainda estava falhando). Obrigado por apontar o problema para a gradle que deu essa solução alternativa. Consulte o documento de referência em https://docs.gradle.org/current/userguide/build_environment.html#sec:accessing_the_web_via_a_proxy

Atualizar Você também pode colocar essas propriedades em gradle-wrapper.properties(consulte: https://stackoverflow.com/a/50492027/474034 ).

Guillaume Berche
fonte
4
me ajudou muito quando se utiliza cntlm
Łukasz Siwiński
5
como você remove proxy?
Jonathan
2
Também -Dhttps.proxyUser = usuário -Dhttps.proxyPassword = pass
Owen B
10
Se você colocar as propriedades em ~/.gradle/gradle.propertiescertifique-se prefixar as propriedades com systemProp, como, por exemplosystemProp.http.proxyHost=127.0.0.1
Stefan Haberl
1
Eu tentei isso e não funcionou para mim. Eu tive que definir as opções ( -Dhttp.proxyHoste os gostos) como JAVA_OPTSvariável de ambiente para fazê-lo funcionar.
GoldenD 14/09
66

Esta é a minha gradle.properties, observe as partes HTTPS

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8118
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8118
Kampau Ocu
fonte
55

No meu build.gradleeu tenho a seguinte tarefa, que usa as configurações usuais de proxy linux HTTP_PROXYe HTTPS_PROXY, a partir do ambiente de shell:

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            def url = e.value.toURL()
            println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
        }
    }
}

build.dependsOn setHttpProxyFromEnv
SourceSimian
fonte
2
É divertido! É o build.gradle da sua raiz ou o build.gradle do aplicativo?
Miao1007
1
Funciona no Windows 7 também! Esta deve ser a resposta aceita!
1
Obrigado! o acima funcionou para configurações que não precisam de uma senha de proxy. Eu modifiquei-lo para o trabalho com ou w / o senha de proxy veja abaixo
Norbert
if (key in map.keySet ()) {
JustAnotherCoder
melhor resposta. gostaria que o ecossistema java funcionasse assim
imediatamente
26

Para mim, trabalha adicionando essa configuração no arquivo gradle.properties do projeto, onde o arquivo build.gradle é:

systemProp.http.proxyHost=proxyURL
systemProp.http.proxyPort=proxyPort
systemProp.http.proxyUser=USER
systemProp.http.proxyPassword=PASSWORD
systemProp.https.proxyHost=proxyUrl 
systemProp.https.proxyPort=proxyPort
systemProp.https.proxyUser=USER
systemProp.https.proxyPassword=PASSWORD

Onde: proxyUrl é o URL do servidor proxy ( http: // ..... )

proxyPort é a porta (geralmente 8080)

USER é meu usuário de domínio

SENHA, minha senha

Nesse caso, o proxy para http e https é o mesmo

rtrujillor
fonte
23

Tente o seguinte:

gradle -Dhttp.proxyHost=yourProxy -Dhttp.proxyPort=yourPort -Dhttp.proxyUser=usernameProxy -Dhttp.proxyPassword=yourPassoword

Raphael Vitor
fonte
2
Considere quando essa pergunta foi feita. O link questão I na minha resposta foi marcado resolvida no sentido de Gradle 1.0-marco-8 ...
Daniel Beck
2
@ Daniel esta questão foi a primeira coisa que apareceu, quando eu procurei por "procuração Gradle", eu desnatado as respostas e que um foi o mais claro para o meu necessidade ...
Betlista
22

Usando um programa Java "Request a URL" muito simples, consegui replicar o problema.

http.proxyUsere http.proxyPasswordparecem ser opções não padronizadas, embora populares, pois não são descritas na página de referência do Java vinculada ao tutorial Gradle ; mesmo que o manual Gradle os mencione.

Parece que os programas Java que desejam oferecer suporte à autenticação de proxy precisam fazer isso manualmente (e eu pude fazer isso usando o código na página vinculada).


Enviei esse problema (e uma correção) para o rastreador de problemas do Gradle . O problema levantado GRADLE-1556 foi resolvido no 1.0-milestone-8 (fevereiro de 2012)

Daniel Beck
fonte
O bloco vinculado aparece para mim apenas como convite. Existe um exemplo público dessa solução alternativa?
Mike Yockey
@yock Veja o anexo da questão que enviei à Gradle, é muito semelhante.
Daniel Beck
19

Confira em c: \ Users \ seu nome de usuário \ .gradle \ gradle.properties:

systemProp.http.proxyHost=<proxy host>
systemProp.http.proxyPort=<proxy port>
systemProp.http.proxyUser=<proxy user>
systemProp.http.proxyPassword=<proxy password>
systemProp.http.nonProxyHosts=<csv of exceptions>
systemProp.https.proxyHost=<proxy host>
systemProp.https.proxyPort=<proxy port>
systemProp.https.proxyUser=<proxy user>
systemProp.https.proxyPassword=<proxy password>
systemProp.https.nonProxyHosts=<csv of exceptions seperated by | >
Charles Tempo
fonte
5
@MurrayFoxcroft Onde você vê um link nessa resposta?
precisa saber é o seguinte
Basicamente, um link para a máquina local e um despejo de arquivos. Por favor, descreva a resposta com mais detalhes.
Murray Foxcroft
superrrrrr tnx, u pode não perceber o quão útil pós ur era para mim, mas ainda grande obrigado
Seyed Ali Roshan
@SeyedAliRoshan Como podemos passar proxyUser e senha por argumento? Eu não quero usuário arquivo globle gradle.propaerties.
Nullpointer
@ Nullpointer você tentou usar a configuração de proxy dentro do gradle do seu projeto?
Seyed Ali Roshan
12

Crie um arquivo chamado gradle.propertiesdentro da pasta do projeto em que o build.gradlearquivo está presente. Adicione a seguinte entrada

     systemProp.http.proxyHost=proxy_url
     systemProp.http.proxyPort=proxy_port
     systemProp.http.proxyUser=USER
     systemProp.http.proxyPassword=PWD
     systemProp.https.proxyHost=proxy_url 
     systemProp.https.proxyPort=proxy_port
     systemProp.https.proxyUser=USER
     systemProp.https.proxyPassword=PWD

Se você estiver usando DNS para proxy, adicione-o como systemProp.https.proxyHost=www.proxysite.com

Para o IP, apenas especifique o IP sem http://ou https://
verifique o documento oficial do gradle para obter mais detalhes e configurar o proxy em nível global

user2720864
fonte
9

Existem duas maneiras de usar o Gradle atrás de um proxy:

Adicionar argumentos na linha de comando

(Do post de Guillaume Berche)

Adicione estes argumentos no seu comando gradle:

-Dhttp.proxyHost=your_proxy_http_host -Dhttp.proxyPort=your_proxy_http_port

ou esses argumentos se você estiver usando https:

-Dhttps.proxyHost=your_proxy_https_host -Dhttps.proxyPort=your_proxy_https_port

Adicionar linhas no arquivo de configuração gradle

em gradle.properties adicionar as seguintes linhas:

systemProp.http.proxyHost=your_proxy_http_host
systemProp.http.proxyPort=your_proxy_http_port
systemProp.https.proxyHost=your_proxy_https_host
systemProp.https.proxyPort=your_proxy_https_port

(para gradle.propertieslocalização do arquivo, consulte a documentação oficial https://docs.gradle.org/current/userguide/build_environment.html


EDIT: como dito por @Joost: Um detalhe pequeno, mas importante, que eu ignorei inicialmente: observe que o nome do host real NÃO contém http:// parte do protocolo da URL ...

Thibault
fonte
1
Um pequeno, mas importante detalhe que eu inicialmente ignorado: aviso de que o nome do host real não contêm http://parte de protocolo do URL ...
Joost
5

Baseado na resposta do SourceSimian; isso funcionou nas contas de usuário do domínio do Windows. Observe que o nome de usuário não possui domínio incluído,

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            def url = e.value.toURL()
            println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
            System.setProperty("${base}.proxyUser", "Username")
            System.setProperty("${base}.proxyPassword", "Password")
        }
    }
}
build.dependsOn setHttpProxyFromEnv
Kunal B.
fonte
Obrigado! Há uma atualização sobre como obter nome de usuário e senhas de proxy dinamicamente abaixo
Norbert
1

Uma atualização para @sourcesimian 's e @ kunal-b que definem dinamicamente o nome de usuário e a senha, se configurados nas propriedades do sistema.

A seguir, define o nome de usuário e a senha, se fornecidos, ou apenas adiciona o host e a porta, se nenhum nome de usuário e senha estiverem definidos.

task setHttpProxyFromEnv {
    def map = ['HTTP_PROXY': 'http', 'HTTPS_PROXY': 'https']
    for (e in System.getenv()) {
        def key = e.key.toUpperCase()
        if (key in map) {
            def base = map[key]
            //Get proxyHost,port, username, and password from http system properties 
            // in the format http://username:password@proxyhost:proxyport
            def (val1,val2) = e.value.tokenize( '@' )
            def (val3,val4) = val1.tokenize( '//' )
            def(userName, password) = val4.tokenize(':')
            def url = e.value.toURL()
            //println " - systemProp.${base}.proxy=${url.host}:${url.port}"
            System.setProperty("${base}.proxyHost", url.host.toString())
            System.setProperty("${base}.proxyPort", url.port.toString())
            System.setProperty("${base}.proxyUser", userName.toString())
            System.setProperty("${base}.proxyPassword", password.toString())
        }
    }
}
Norbert
fonte
1

Caso eu tente configurar o proxy no android studio Appearance & Behavior => Configurações do sistema => HTTP Proxy. Mas o proxy não funcionou, então não clico em proxy.

Marcar NO PROXY não removerá a configuração de proxy do gradle.properties (Global). Você precisa removê-lo manualmente.

Portanto, removo todas as propriedades que começam com systemProp, por exemplo - systemProp.http.nonProxyHosts = *. Local, localhost

Anirban
fonte
Estou arrancando meu cabelo há uma hora, aparentemente no Mac, essas propriedades foram adicionadas automaticamente ao meu ~/.gradle/gradle.properties. Obrigado por apontar isso.
EpicPandaForce 04/12/19
0

Se você estiver atrás do proxy e usando o eclipse, acesse Window Menu --> Preferences --> General --> Network Connections. Selecione os fornecedores ativos como 'Manual'.

Na seção Entradas de proxy, clique em HTTPS, clique em Editar e adicione host e porta do proxy. Se for necessário nome de usuário e senha, forneça isso também. Funcionou para mim!

Quem sou eu
fonte
0

Se esse problema com o erro HTTP 407 ocorreu apenas nos pacotes selecionados, o problema não está na configuração de proxy e na conexão com a Internet. Você pode até expor seu PC à Internet através do NAT e ainda enfrentará esse problema. Normalmente, ao mesmo tempo, você pode baixar os pacotes desejados no navegador. A única solução que encontro: exclua a pasta .gradle no seu perfil (não no projeto). Depois dessa sincronização, o projeto levará muito tempo, mas restaurará tudo.

Almaz
fonte