可以在 Java 应用程序中检测系统代理设置,但不能在 JUnit 中检测系统代理设置

2022-09-03 15:14:05
  • 视窗 7
  • Java 1.8.0_45
  • 日食火星

如果您已将系统代理设置为HTTP,则仅当它从java应用程序的方法运行时,才会打印以下内容。HTTPmain

但是,如果它是从JUnit 4测试(在eclipse中)调用的,则它始终打印。DIRECT

还注意到,在 eclipse 中定义:运行配置 ->参数 -> VM 参数。测试只是挂起。-Djava.net.useSystemProxies=true

你知道发生了什么吗?

多谢

public void printSystemProxy() {
    System.setProperty("java.net.useSystemProxies", "true");
    try {
        final List<Proxy> list = ProxySelector.getDefault().select(new URI("http://foo/bar"));
        for (final Proxy proxy : list) {
            System.out.println(proxy.type());
        }
    } 
    catch (final URISyntaxException e) {
        throw new IllegalStateException(e);
    }
}

答案 1

尝试使用以下 VM 参数进行 TestRunner 配置(右键单击/RunAs...):

-Dhttp.proxyHost=<YOUR_PROXY>
-Dhttp.proxyPort=<YOUR_PORT>
-Dhttp.nonProxyHosts=<IF YOU NEED THIS (pipe as separator)>
-Dhttp.proxyUser=<YOUR_NAME>
-Dhttp.proxyPassword=<YOUR_PASWORD>

答案 2

您无法在运行时更改 Java 的系统代理行为。系统属性仅在启动时读取。从文档中(着重号是后加的):java.net.useSystemProxies

java.net.useSystemProxies (default: false)

在最近的 Windows 系统和 Gnome 2.x 系统上,可以告诉 java.net 堆栈(将此属性设置为 true)以使用系统代理设置(这两个系统都允许您通过其用户界面全局设置代理)。请注意,此属性仅在启动时检查一次。

动态设置系统属性不会更改行为。您必须像使用方法一样将其作为JVM参数发送。另一种方法是不使用系统代理,而是允许用户提供自己的代理。-Dmain

或者,在应用程序启动后,可以修改其他代理属性,如 、 等(在上面的文档链接中列出)。根据您的应用程序,这可能是一个更好的解决方案,因为它通常具有更好的跨平台支持。http.proxyHosthttp.proxyPort


推荐