variable solucion configurar behind java eclipse proxy network-programming environment-variables

solucion - recuperar valores predeterminados definidos en el archivo Java net.properties



jvm proxy environment variable (1)

Resumen de conclusiones

  1. El archivo ${java.home}/lib/net.properties no se carga en las propiedades del sistema ( System::getProperties ) .
  2. 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 de java.net.useSystemProxies incluso si se establece en true .
  3. Puede acceder al archivo net.properties cargándolo manualmente como propiedades usando Properties::load . La ubicación exacta se encuentra en el directorio Inicio de Java, que se puede recuperar utilizando la java.home sistema java.home , dentro del subdirectorio lib .
  4. 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''.
  5. 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:

  1. jre/lib/net.properties como valor predeterminado
  2. Desde la configuración de Internet de su sistema (Panel de control, etc.) cuando java.net.useSystemProxies se establece en verdadero.
  3. 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.
  4. 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:

  1. Al configurar la propiedad del sistema explícitamente de la siguiente manera: System.setProperty("http.proxyHost", "other.net"); justo antes de hacer ProxySelector::select , anulará el valor en net.properties .
  2. Anular el uso de las propiedades del sistema solo afectará exactamente la misma propiedad del sistema. Es decir, si solo reemplaza http.proxyHost , seguirá heredando http.proxyPort si se establece en net.properties .
  3. 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 cuando java.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?