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

时间:2015-06-29 12:24:56

标签: java eclipse junit proxy system-properties

  • Windows 7
  • Java 1.8.0_45
  • Eclipse Mars

如果您将系统代理设置为HTTP,则只有从HTTP java应用程序的方法运行时,以下内容才会打印main

但是,如果从JUnit 4测试(在eclipse中)调用它,它总是打印DIRECT

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

知道发生了什么事吗?

非常感谢,

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);
    }
}

3 个答案:

答案 0 :(得分:5)

尝试使用以下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>

答案 1 :(得分:3)

您无法在运行时更改Java的系统代理行为。 java.net.useSystemProxies系统属性仅在启动时读取。 From the documentation(强调补充):

  

java.net.useSystemProxies(默认值:false)

     

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

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

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

答案 2 :(得分:3)

您在Eclipse中设置的代理设置将影响所有工具,包括Eclipse和Maven本身。这可能就是你有一个“挂”的原因。 ......它可能不是你的JUnit测试,但是maven本身就挂了(需要澄清)。

但是,在这种情况下,在我看来,您可以在负责JUnit测试的插件中更改系统属性:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
      <systemPropertyVariables>
        <java.net.useSystemProxies>true</java.net.useSystemProxies>
      </systemPropertyVariables>
    </configuration>
  </plugin>

[UPDATE]

在某些情况下,系统属性仅在启动时使用,仅在您在命令行设置时才有效。在这种情况下,you can supply it as part of the command-line arguments

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
      <argLine>-Djava.net.useSystemProxies=true</argLine>
    </configuration>
  </plugin>

另请注意,如果您想在maven中运行它,则必须选择&#39; Run as - &gt; Maven测试&#39;,而不是&#39; Run As - &gt; JUnit测试&#39;。

[RANTING Follows]

我讨厌这样说 - 但是在这一点上,Java中对Proxies的支持真的很差。

有一项重大改进:现在您可以为要建立的每个连接定义单独的代理。但是,我认为这应该有很多改进:

  1. 每个代理的单独身份验证。现在即使我可以为每个连接定义代理,对所有人使用相同的身份验证也是不自然的。更糟糕的是,它甚至会为代理和HTTP连接触发相同的身份验证:它甚至无法区分这两者。
  2. 更好地支持SOCKS代理
  3. 更好地支持查询系统以进行代理设置。现在每个现代操作系统都有默认代理配置。
  4. 内置支持和实际套接字服务器的API。
  5. 听起来像一个幻想破灭的程序员的咆哮,但答案是在实施这些!这值得JEP吗?