If I understand Java Networking and Proxies correctly, the jre/lib/net.properties file contains default values that are populated into the system properties at runtime. My net.properties file contains the following, among other things:
http.nonProxyHosts=localhost|127.*|[::1]
But when I run my Java application inside Eclipse 4.5, System.getProperty("http.nonProxyHosts") returns null. I have not defined or overridden this value anywhere within my application.
How am I able to retrieve the value of http.nonProxyHosts defined in jre/lib/net.properties at runtime?
${java.home}/lib/net.properties does not get loaded into the System Properties (System::getProperties).System.setProperty, or setting at the command line, for example using -Dhttp.proxyHost=proxy syntax, will override the the defined property, but also any java.net.useSystemProxies setting even if set to true.net.properties file by loading it manually as properties using Properties::load. The exact location is in the Java Home directory, which can be retrieved using the java.home System Property, within the lib subdirectory.java.net.useSystemProxies=true, you set the proxy used from the control panel, under 'Internet Properties'. From those settings you will need to click on the 'LAN settings' button.I have replicated your example in my environment, using netBeans actually, with this simple example:
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"));
}
}
I print the java.home system property to make sure I am editing the correct jre/lib/net.properties.
however the two properties http.nonProxyHosts and java.net.useSystemProxies print as null, while I can clearly see that both values are set in the net.properties file:
java.net.useSystemProxies=false
http.nonProxyHosts=localhost|127.*|[::1]
Actually the documentation is a little unclear, but it seems that proxy configuration can be done in one of several ways:
jre/lib/net.properties as the defaultjava.net.useSystemProxies is set to true.System.propertiesIt appears to me that this is a cusom feature of the java.net api's, and will read the net.properties only in case the system properties are not set explicitly. I suspect that does not mean that the net.properties file is used to set system properties, but are only read by the java.net api's themselves.
Note also this text within the default installed net.properties file:
This file may contain default values for the networking system properties. These values are only used when the system properties are not specified on the command line or set programatically.
It only says that these values will be used, nothing specific about setting the system properties themselves.
[UPDATE]
With a small example, I was able to prove that out
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");
}
}
}
You can see that the http.proxyHost prints as null, while with the default net.properties, the proxy for "http://www.yahoo.com" prints as DIRECT. DIRECT means no proxy. This is because in the net.properties file,http.proxyHost` is undefined.
Now I modify the net.properties file as follows (un-commenting and modifying the existing entry):
http.proxyHost=this.is.a.test.net
Now when I run the same code, I get following output:
C:\Program Files\Java\jdk1.8.0_20\jre
null
HTTP Proxies
HTTP @ this.is.a.test.net:80
The System Property is still null, however the same setting from the net.properties file did take effect.
Some other observations:
System.setProperty("http.proxyHost", "other.net"); right before doing the ProxySelector::select, will override the value in net.properties.http.proxyHost, it will still inherit http.proxyPort if set in net.properties.net.properties file, or by explicitly setting the system property in code, I set http.proxyHost explicitly, this will always override the System default even when java.net.useSystemProxies is set to true. java.net.useSystemProxies=true only works when the proxy is not explicitly set, and will be otherwise ignored (I have tested and verified this).[Update 2]
If your ultimate goal is just to access the content of the net.properties file, you can try something as follows:
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"));
}
}
You figure out security and privileges!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With