Muitas vezes, um aplicativo Java precisa se conectar à Internet. O exemplo mais comum acontece quando está lendo um arquivo XML e precisa fazer o download de seu esquema.
Estou atrás de um servidor proxy. Como posso configurar minha JVM para usar o proxy?
Respostas:
Na documentação Java ( não na API javadoc):
http://download.oracle.com/javase/6/docs/technotes/guides/net/proxies.html
Defina os sinalizadores da JVM
http.proxyHost
ehttp.proxyPort
ao iniciar sua JVM na linha de comandos. Isso geralmente é feito em um script de shell (no Unix) ou em um arquivo bat (no Windows). Aqui está o exemplo com o script de shell Unix:Ao usar contêineres como JBoss ou WebLogic, minha solução é editar os scripts de inicialização fornecidos pelo fornecedor.
Muitos desenvolvedores estão familiarizados com a API Java (javadocs), mas muitas vezes o restante da documentação é negligenciado. Ele contém muitas informações interessantes: http://download.oracle.com/javase/6/docs/technotes/guides/
Atualização: se você não deseja usar o proxy para resolver alguns hosts locais / intranet, confira o comentário em @Tomalak:
fonte
http.nonProxyHosts
propriedade! (uso como este:-Dhttp.nonProxyHosts="localhost|127.0.0.1|10.*.*.*|*.foo.com|etc"
)http.proxyUser
ehttp.proxyPassword
não são propriedades do sistema Java. Eles são para o cliente HTTP Apache.https.proxyHost
ehttps.proxyPort
para HTTPs.Para usar a configuração de proxy do sistema:
Ou programaticamente:
Fonte: http://docs.oracle.com/javase/7/docs/api/java/net/doc-files/net-properties.html
fonte
Para definir um proxy HTTP / HTTPS e / ou SOCKS programaticamente:
Lembre-se de que os proxies HTTP e os proxies SOCKS operam em níveis diferentes na pilha da rede, para que você possa usar um ou outro ou ambos.
fonte
Você pode definir esses sinalizadores programaticamente desta maneira:
Basta retornar os valores corretos a partir dos métodos
needsProxy()
,getProxyHost()
egetProxyPort()
e você pode chamar este trecho de código quando quiser.fonte
A JVM usa o proxy para fazer chamadas HTTP
Isso pode usar o proxy de configuração do usuário
fonte
System.setProperty
vez deSystem.getProperties().put(...)
Você pode definir algumas propriedades sobre o servidor proxy como parâmetros jvm
-Dhttp.proxyPort = 8080, proxyHost, etc.
mas se você precisar passar por um proxy de autenticação, precisará de um autenticador como este exemplo:
ProxyAuthenticator.java
Example.java
Com base nesta resposta: http://mail-archives.apache.org/mod_mbox/jakarta-jmeter-user/200208.mbox/%3C494FD350388AD511A9DD00025530F33102F1DC2C@MMSX006%3E
fonte
Combinando as respostas de Sorter e javabrett / Leonel:
fonte
Defina a
java.net.useSystemProxies
propriedade comotrue
. Você pode configurá-lo, por exemplo, através da variável de ambiente JAVA_TOOL_OPTIONS . No Ubuntu, você pode, por exemplo, adicionar a seguinte linha a.bashrc
:fonte
A seguir, mostramos como configurar em Java um proxy com usuário proxy e senha de proxy na linha de comandos, que é um caso muito comum. Você não deve salvar senhas e hosts no código, como regra geral.
Passar as propriedades do sistema na linha de comando com -D e defini-las no código com System.setProperty ("name", "value") é equivalente.
Mas observe isso
Exemplo que funciona:
Mas o seguinte não funciona :
A única diferença é a posição das propriedades do sistema! (antes e depois da aula)
Se você tiver caracteres especiais na senha, poderá colocá-lo entre aspas "@ MyPass123%", como no exemplo acima.
Se você acessar um serviço HTTPS, você tem que usar
https.proxyHost
,https.proxyPort
etc.Se você acessar um serviço HTTP, você tem que usar
http.proxyHost
,http.proxyPort
etc.fonte
Se você está contando com a recuperação de esquemas ou DTDs pela Internet, está criando um aplicativo lento, falador e frágil. O que acontece quando o servidor remoto que hospeda o arquivo leva um tempo de inatividade planejado ou não planejado? Seu aplicativo é interrompido. Tudo bem?
Consulte http://xml.apache.org/commons/components/resolver/resolver-article.html#s.catalog.files
URLs para esquemas e afins são mais bem pensados como identificadores exclusivos. Não como solicitações para acessar esse arquivo remotamente. Faça uma pesquisa no google no "catálogo XML". Um catálogo XML permite que você hospede esses recursos localmente, resolvendo a lentidão, a propriedade e a fragilidade.
É basicamente uma cópia permanentemente em cache do conteúdo remoto. E tudo bem, já que o conteúdo remoto nunca muda. Se houver alguma atualização, ela estará em um URL diferente. Tornar a recuperação real do recurso pela Internet especialmente boba.
fonte
Também estou atrás de firewall, isso funcionou para mim !!
fonte
Se você deseja "Socks Proxy", informe os argumentos da VM "socksProxyHost" e "socksProxyPort".
por exemplo
fonte
Adicione isso antes de se conectar a um URL atrás de um proxy.
fonte
http.proxyUser
ehttp.proxyPassword
não são propriedades do sistema Java. Eles são para o cliente HTTP Apache.System.setProperty
vez deSystem.getProperties().put(...)
Esta é uma atualização secundária, mas desde o Java 7, as conexões de proxy agora podem ser criadas de forma programática, e não através das propriedades do sistema. Isso pode ser útil se:
Aqui está um exemplo artificial no groovy:
Referência completa: http://docs.oracle.com/javase/7/docs/technotes/guides/net/proxies.html
fonte
Recentemente, descobri a maneira de permitir que a JVM use as configurações de proxy do navegador. O que você precisa fazer é adicionar
${java.home}/lib/deploy.jar
ao seu projeto e iniciar a biblioteca da seguinte maneira:Posteriormente, as configurações de proxy estão disponíveis para a API Java via
java.net.ProxySelector
.O único problema com essa abordagem é que você precisa iniciar a JVM
deploy.jar
no bootclasspath, por exemplojava -Xbootclasspath/a:"%JAVA_HOME%\jre\lib\deploy.jar" -jar my.jar
. Se alguém souber como superar essa limitação, me avise.fonte
xbootclasspath
apontar para deploy.jar teria efeito?Exception in thread "main" java.lang.IllegalAccessError: class ...) cannot access class com.sun.deploy.net.proxy.DeployProxySelector (in module jdk.deploy) because module jdk.deploy does not export com.sun.deploy.net.proxy
Isso funciona para mim:
P / S: Baseio-me na resposta do GHad.
fonte
Conforme indicado em outras respostas, se você precisar usar proxies autenticados, não há uma maneira confiável de fazer isso puramente usando variáveis de linha de comando - o que é irritante se você estiver usando o aplicativo de outra pessoa e não quiser mexer com o Código fonte.
Will Iverson faz a sugestão útil em Como usar o HttpProxy para conectar-se a um host com autenticação preventiva para usar uma ferramenta de gerenciamento de proxy como o Proxifier ( http://www.proxifier.com/ para Mac OS X e Windows) para lidar com isso.
Por exemplo, com o Proxifier, você pode configurá-lo para interceptar apenas comandos java para serem gerenciados e redirecionados por meio de seu proxy (autenticado). Você vai querer definir os valores proxyHost e proxyPort como em branco neste caso, por exemplo, passe
-Dhttp.proxyHost= -Dhttp.proxyPort=
para seus comandos java.fonte
Você pode utilizar as variáveis http.proxy * JVM se estiver dentro de uma JVM autônoma, mas NÃO DEVE modificar os scripts de inicialização e / ou fazer isso no servidor de aplicativos (exceto talvez o jboss ou o tomcat). Em vez disso, você deve utilizar a API do Proxy JAVA (não System.setProperty) ou utilizar as opções de configuração do próprio fornecedor. O WebSphere e o WebLogic têm maneiras muito definidas de configurar os proxies que são muito mais poderosos que o J2SE. Além disso, para o WebSphere e o WebLogic, você provavelmente interromperá o servidor de aplicativos de pequenas maneiras, substituindo os scripts de inicialização (particularmente os processos de interoperabilidade do servidor, como você pode estar dizendo a eles para usar seu proxy também ...).
fonte
Eu acho que configurar o WINHTTP também funcionará.
Muitos programas, incluindo as atualizações do Windows, estão tendo problemas por trás do proxy. A configuração do WINHTTP sempre corrigirá esse tipo de problema
fonte