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.properties
no 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=proxy
sintaxis-Dhttp.proxyHost=proxy
, anulará la propiedad definida, pero también cualquier configuración dejava.net.useSystemProxies
incluso si se establece entrue
. - Puede acceder al archivo
net.properties
cargándolo manualmente como propiedades usandoProperties::load
. La ubicación exacta se encuentra en el directorio Inicio de Java, que se puede recuperar utilizando lajava.home
sistemajava.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.properties
como valor predeterminado - Desde la configuración de Internet de su sistema (Panel de control, etc.) cuando
java.net.useSystemProxies
se 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.proxyPort
si se establece ennet.properties
. - Si está en cualquier lugar, ya sea en el archivo
net.properties
o estableciendo explícitamente la propiedad del sistema en el código, configuréhttp.proxyHost
explícitamente, esto siempre anulará el valor predeterminado del sistema incluso cuandojava.net.useSystemProxies
se establece en verdadero.java.net.useSystemProxies=true
solo 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?