Java 在不更改代码的情况下,如何通过环境变量或JVM参数强制httpClient使用代理

Java 在不更改代码的情况下,如何通过环境变量或JVM参数强制httpClient使用代理,java,apache-commons-httpclient,Java,Apache Commons Httpclient,我发现设置http.proxyHost和http.proxyPort对httpClient没有用处。如何在不更改代码的情况下强制httpClient使用环境变量、VM参数或类似的代理?这有帮助吗 System.setProperty("https.proxyHost", proxy_host); System.setProperty("http.proxyHost", proxy_host); System.setProperty("https.proxyPort", proxy_port);

我发现设置http.proxyHost和http.proxyPort对httpClient没有用处。如何在不更改代码的情况下强制httpClient使用环境变量、VM参数或类似的代理?

这有帮助吗

System.setProperty("https.proxyHost", proxy_host);
System.setProperty("http.proxyHost", proxy_host);
System.setProperty("https.proxyPort", proxy_port);
System.setProperty("http.proxyPort", proxy_port);

当然,您也可以通过命令行传递相同的属性,您可以使用
client.getHostConfiguration().setProxy(主机、端口)
方法强制代理到
HttpClient
。我通常围绕
HttpClient
创建包装类,在初始化此类时,我会从任何源(环境变量…)设置代理

我使用了
java.net.ProxySelector.setDefault(新的MyProxySelector())
来处理不能直接在
HttpClient
上设置代理的情况。您必须实现自己的ProxySelector类,并且方法select根据请求的URI进行代理选择。您可以进行url->proxy映射,以将特定URI地址配置为所需的代理,或为所有请求的URI全局返回一个代理

正如我在HttpClient源代码中看到的,没有其他方法可以配置proxy-only-setProxy方法。我正在使用commons-httpclient-3.1

SystemDefaultHttpClient已添加到版本。4.2


请参见

AFAIK,如果不更改代码,您无法管理此操作,但您可以通过使用自己的连接管理器更接近本机行为。请参见HTTP客户机(我的案例为v4.5.1)可以使用如下系统代理:

HttpClient httpClient = HttpClientBuilder.create().useSystemProperties().build();
//or 
HttpClient httpClient = HttpClients.createSystem();

不幸的是,这对httpclient不起作用,这是我的问题。问题清楚地表明这些变量不起作用。@user496949您能围绕
httpclient
创建包装类并始终按自己的方式初始化它吗?比如说,我有一个第三方库,它在里面使用httpclient来获取一些东西。如何处理这种情况?在本例中,我使用了
java.net.ProxySelector.setDefault(新的MyProxySelector())。您必须实现自己的ProxySelector类和方法select根据请求的URI进行代理选择(进行urlproxy映射以将特定URL地址配置为所需代理)。正如我在
HttpClient
源代码中所看到的,没有其他方法可以配置代理,即使是setProxy方法。我使用的是commons-httpclient-3.1。确切地说,您可以像这样使用系统属性。不要忘记,连接到https://... URL必须使用https.proxyHost等属性。一个类似的问题,我的回答是:你找到解决这个问题的方法了吗?我面临同样的问题,第三方库(azure keyvault java sdk)使用自己的httpClient,我无法强制它使用代理。实际的http调用是在新的Executor线程中进行的,这不允许我在调用线程中设置ProxySelector。有什么解决方案吗?我们也有同样的问题,我们希望在不更改代码的情况下执行此操作,因为我们需要发布新的部署来执行此操作,因此即使是配置更改也被视为代码更改。我们的结论是,不可能用JVM命令行选项覆盖客户机的配置,您只需更改客户机的配置并发布一个新版本。正如@wangf在下面提到的,您还可以在调用
.build()之前使用
.useSystemProperties()
在任何HttpClientBuilder上读取系统属性,如
http.proxyHost
http.proxyPort