如果您将系统代理设置为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);
}
}
答案 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.proxyHost
,http.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的支持真的很差。
有一项重大改进:现在您可以为要建立的每个连接定义单独的代理。但是,我认为这应该有很多改进:
听起来像一个幻想破灭的程序员的咆哮,但答案是在实施这些!这值得JEP吗?