solucion - recuperar valores predeterminados definidos en el archivo Java net.properties
jvm proxy environment variable (1)
Resumen de conclusiones
- El archivo
${java.home}/lib/net.propertiesno se carga en las propiedades del sistema (System::getProperties) . - Configurar el proxy manualmente a través de
System.setProperty, o establecerlo en la línea de comando, por ejemplo usando-Dhttp.proxyHost=proxysintaxis-Dhttp.proxyHost=proxy, anulará la propiedad definida, pero también cualquier configuración dejava.net.useSystemProxiesincluso si se establece entrue. - Puede acceder al archivo
net.propertiescargándolo manualmente como propiedades usandoProperties::load. La ubicación exacta se encuentra en el directorio Inicio de Java, que se puede recuperar utilizando lajava.homesistemajava.home, dentro del subdirectoriolib. - En un escritorio de Windows, cuando se usa en combinación con
java.net.useSystemProxies=true, configura el proxy utilizado desde el panel de control, en ''Propiedades de Internet''. Desde esa configuración, deberá hacer clic en el botón ''Configuración LAN''. - Un applet tiene un nivel adicional de configuración, ver Proxy Setup en la documentación de Java.
Investigación
He replicado su ejemplo en mi entorno, usando netBeans en realidad, con este simple ejemplo:
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 propiedad del sistema java.home para asegurarme de que estoy editando el jre/lib/net.properties .
sin embargo, las dos propiedades http.nonProxyHosts y java.net.useSystemProxies imprimen como nulas, mientras que puedo ver claramente que ambos valores se establecen en el archivo net.properties :
java.net.useSystemProxies=false
http.nonProxyHosts=localhost|127.*|[::1]
En realidad, la documentación no está clara, pero parece que la configuración del proxy se puede realizar de varias maneras:
-
jre/lib/net.propertiescomo valor predeterminado - Desde la configuración de Internet de su sistema (Panel de control, etc.) cuando
java.net.useSystemProxiesse establece en verdadero. - Desde la Configuración de Java, como se establece en el panel de control de Java, y cuando se ejecuta como un applet, y potencialmente heredado de la configuración de su navegador.
-
System.properties
Me parece que esta es una característica común de las api de java.net, y leerá net.properties solo en caso de que las propiedades del sistema no estén establecidas explícitamente. Sospecho que eso no significa que el archivo net.properties se use para configurar las propiedades del sistema, sino que solo las mismas API de java.net lo lean.
Tenga en cuenta también este texto dentro del archivo net.properties instalado por defecto:
Este archivo puede contener valores predeterminados para las propiedades del sistema de red. Estos valores solo se usan cuando las propiedades del sistema no están especificadas en la línea de comando o configuradas programáticamente.
Solo dice que se usarán estos valores, nada específico sobre la configuración de las propiedades del sistema.
[ACTUALIZAR]
Con un pequeño ejemplo, pude comprobarlo
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");
}
}
}
Puede ver que http.proxyHost imprime como nulo, mientras que con net.properties predeterminado, el proxy para "http://www.yahoo.com" imprime como DIRECT . DIRECT significa no proxy. Esto se debe a que en el net.properties file, net.properties net.properties file, http.proxyHost` no está definido.
Ahora net.properties archivo net.properties la siguiente manera (sin comentarios y modificando la entrada existente):
http.proxyHost=this.is.a.test.net
Ahora cuando ejecuto el mismo código, obtengo el siguiente resultado:
C:/Program Files/Java/jdk1.8.0_20/jre
null
HTTP Proxies
HTTP @ this.is.a.test.net:80
La propiedad del sistema sigue siendo nula, sin embargo, la misma configuración del archivo net.properties efecto.
Algunas otras observaciones:
- Al configurar la propiedad del sistema explícitamente de la siguiente manera:
System.setProperty("http.proxyHost", "other.net");justo antes de hacerProxySelector::select, anulará el valor ennet.properties. - Anular el uso de las propiedades del sistema solo afectará exactamente la misma propiedad del sistema. Es decir, si solo reemplaza
http.proxyHost, seguirá heredandohttp.proxyPortsi se establece ennet.properties. - Si está en cualquier lugar, ya sea en el archivo
net.propertieso estableciendo explícitamente la propiedad del sistema en el código, configuréhttp.proxyHostexplícitamente, esto siempre anulará el valor predeterminado del sistema incluso cuandojava.net.useSystemProxiesse establece en verdadero.java.net.useSystemProxies=truesolo funciona cuando el proxy no está establecido explícitamente, y de lo contrario será ignorado (lo he probado y verificado).
[Actualización 2]
Si su objetivo final es solo acceder al contenido del archivo net.properties, puede intentar algo de la siguiente manera:
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"));
}
}
¡Descubre la seguridad y los privilegios!
Si entiendo Java Networking y Proxies correctamente, el archivo jre/lib/net.properties contiene valores predeterminados que se rellenan en las propiedades del sistema en tiempo de ejecución. Mi archivo net.properties contiene lo siguiente, entre otras cosas:
http.nonProxyHosts=localhost|127.*|[::1]
Pero cuando ejecuto mi aplicación Java dentro de Eclipse 4.5, System.getProperty("http.nonProxyHosts") devuelve null . No he definido ni anulado este valor en ninguna parte dentro de mi aplicación.
¿Cómo puedo recuperar el valor de http.nonProxyHosts definido en jre/lib/net.properties en tiempo de ejecución?