如果我正确理解Java Networking and Proxies,jre/lib/net.properties
文件包含在运行时填充到系统属性中的默认值。我的net.properties
文件包含以下内容:
http.nonProxyHosts=localhost|127.*|[::1]
但是当我在Eclipse 4.5中运行我的Java应用程序时,System.getProperty("http.nonProxyHosts")
会返回null
。 我没有在我的应用程序中的任何位置定义或覆盖此值。
如何在运行时检索http.nonProxyHosts
中定义的jre/lib/net.properties
的值?
答案 0 :(得分:6)
${java.home}/lib/net.properties
未加载到System Properties (System::getProperties
)。System.setProperty
手动设置代理,或者在命令行设置代理,例如使用-Dhttp.proxyHost=proxy
语法,将覆盖已定义的属性,但也会覆盖任何java.net.useSystemProxies
设置,即使设为true
。Properties::load
手动将其加载为属性来访问net.properties
文件。确切位置位于Java主目录中,可以使用lib
子目录中的java.home
系统属性进行检索。java.net.useSystemProxies=true
结合使用时,可以在“Internet属性”下设置从控制面板使用的代理。在这些设置中,您需要单击“局域网设置”按钮。我已经在我的环境中复制了你的例子,实际上是使用netBeans,这个简单的例子:
public class Play {
public static void main(String args[]) {
System.out.println(System.getProperty("java.home"));
System.out.println(System.getProperty("http.nonProxyHosts"));
System.out.println(System.getProperty("java.net.useSystemProxies"));
}
}
我打印java.home
系统属性以确保我正在编辑正确的jre/lib/net.properties
。
然而,两个属性http.nonProxyHosts
和java.net.useSystemProxies
打印为null,而我可以清楚地看到这两个值都在net.properties
文件中设置:
java.net.useSystemProxies=false
http.nonProxyHosts=localhost|127.*|[::1]
实际上文档有点不清楚,但似乎代理配置可以通过以下几种方式之一完成:
jre/lib/net.properties
作为默认java.net.useSystemProxies
设置为true时,从系统的互联网设置(控制面板等)。System.properties
在我看来,这是java.net api的一个cusom功能,只有在未明确设置系统属性的情况下才会读取net.properties。我怀疑不是否意味着net.properties
文件用于设置系统属性,但只能由java.net api自己读取。
请注意默认安装的net.properties
文件中的此文本:
此文件可能包含网络系统的默认值 属性。这些值仅在系统属性使用时使用 未在命令行中指定或以编程方式设置。
它只表示这些值将使用,没有具体关于设置系统属性本身。
[UPDATE]
举一个小例子,我能够证明这一点
import java.net.Proxy;
import java.net.ProxySelector;
import java.net.URI;
import java.util.List;
public class Play {
public static void main(String args[]) {
System.out.println(System.getProperty("java.home"));
System.out.println(System.getProperty("http.proxyHost"));
ProxySelector ps = ProxySelector.getDefault();
List<Proxy> proxies = ps.select(URI.create("http://www.yahoo.com"));
System.out.println("HTTP Proxies");
for (Proxy p:proxies) {
System.out.append(p.toString()).append("\n");
}
}
}
您可以看到http.proxyHost
打印为空,而使用默认net.properties
时,"http://www.yahoo.com"
的代理打印为DIRECT
。 DIRECT
表示没有代理。这是因为net.properties file,
http.proxyHost`未定义。
现在我按如下方式修改net.properties
文件(取消注释并修改现有条目):
http.proxyHost=this.is.a.test.net
现在当我运行相同的代码时,我得到以下输出:
C:\Program Files\Java\jdk1.8.0_20\jre
null
HTTP Proxies
HTTP @ this.is.a.test.net:80
系统属性仍为空,但net.properties
文件中的相同设置确实生效。
其他一些观察结果:
System.setProperty("http.proxyHost", "other.net");
之前,如下所示明确设置系统属性:ProxySelector::select
将覆盖net.properties
中的值。http.proxyHost
,如果在http.proxyPort
中设置,它仍然会继承net.properties
。net.properties
文件中的任何地方,或者通过在代码中显式设置系统属性,我明确设置了http.proxyHost
,即使java.net.useSystemProxies
是java.net.useSystemProxies=true
,它也会一直覆盖系统默认值设为true。 import java.io.IOException;
import java.io.Reader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
public class Play {
public static void main(String args[]) {
Properties props = new Properties();
Path path = Paths.get(System.getProperty("java.home"), "lib", "net.properties");
try (Reader r = Files.newBufferedReader(path)) {
props.load(r);
System.out.println("props loaded!");
} catch (IOException x) {
System.err.println("props failed loading!");
x.printStackTrace(System.err);
}
// Now you have access to all the net.properties!
System.out.println(props.getProperty("http.proxyHost"));
}
}
仅在未明确设置代理时有效,否则将被忽略(我已对此进行了测试和验证)。[更新2]
如果您的最终目标只是访问net.properties文件的内容,您可以尝试以下内容:
immutable.Map
你找出了安全和特权!