récupération des valeurs par défaut définies dans Java net.fichier de propriétés


Si je comprends correctement Java Networking and Proxies, le fichier jre/lib/net.properties contient des valeurs par défaut qui sont renseignées dans les propriétés du système lors de l'exécution. Mon fichier net.properties contient entre autres les éléments suivants:

http.nonProxyHosts=localhost|127.*|[::1]

Mais lorsque j'exécute mon application Java dans Eclipse 4.5, System.getProperty("http.nonProxyHosts") renvoie null. Je n'ai défini ou remplacé cette valeur nulle part dans mon application.

Comment puis-je récupérer la valeur de http.nonProxyHosts définie dans jre/lib/net.properties à runtime?

Author: Garret Wilson, 2015-07-11

1 answers

Résumé des conclusions

  1. Le fichier ${java.home}/lib/net.properties n'est pas chargé dans le Propriétés Système (System::getProperties).
  2. Définir le proxy manuellement via System.setProperty ou en ligne de commande, par exemple en utilisant la syntaxe -Dhttp.proxyHost=proxy, remplacera la propriété définie, mais également tout paramètre java.net.useSystemProxies même s'il est défini sur true.
  3. Vous pouvez accéder au fichier net.properties en le chargeant manuellement en tant que propriétés en utilisant Properties::load. L'emplacement exact est dans la maison Java répertoire, qui peut être récupéré en utilisant le java.home Propriété System, dans le sous-répertoire lib.
  4. Sur un bureau Windows, lorsqu'il est utilisé en combinaison avec java.net.useSystemProxies=true, vous définissez le proxy utilisé à partir du panneau de configuration, sous "Propriétés Internet". À partir de ces paramètres, vous devrez cliquer sur le bouton "Paramètres LAN".
  5. Une applet a un niveau supplémentaire de paramètres, voir Proxy Setup dans la documentation Java.

Recherche

J'ai répliqué votre exemple dans mon environnement, en utilisant NetBeans en fait, avec cet exemple simple:

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"));
 }
}

J'imprime la propriété système java.home pour m'assurer que je modifie le jre/lib/net.properties correct.

Cependant, les deux propriétés http.nonProxyHosts et java.net.useSystemProxies imprimer nulle, alors que je peux clairement voir que les deux valeurs sont définies dans l' net.properties fichier:

java.net.useSystemProxies=false
http.nonProxyHosts=localhost|127.*|[::1]

En fait, la documentation est un peu floue, mais il semble que la configuration du proxy puisse être effectuée dans l'un des plusieurs façons:

  1. jre/lib/net.properties comme valeur par défaut
  2. À partir des paramètres Internet de votre système (Panneau de configuration, etc.) lorsque java.net.useSystemProxies est défini sur true.
  3. De la configuration Java, telle que définie dans votre panneau de configuration Java, et lorsqu'elle est exécutée en tant qu'Applet, et potentiellement héritée des paramètres de votre navigateur.
  4. System.properties

Il me semble que c'est une caractéristique de cusom de la java.net api, et lira le net.propriétés uniquement dans le cas où les propriétés système ne sont pas définies explicitement. Je soupçonne que ne signifie pas que le fichier net.properties est utilisé pour définir les propriétés du système, mais java.net api est eux-mêmes.

Notez également ce texte dans le fichier installé par défaut net.properties:

Ce fichier peut contenir des valeurs par défaut pour le système de mise en réseau propriété. Ces valeurs ne sont utilisées que lorsque les propriétés système sont non spécifié sur la ligne de commande ou défini par programme.

Il dit seulement que ces les valeurs seront utilisées , rien de spécifique à la définition des propriétés système elles-mêmes.

[MISE À JOUR]

Avec un petit exemple, j'ai pu le prouver

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");
    }
 }
}

, Vous pouvez voir que le http.proxyHost imprime comme nul, alors la valeur par défaut net.properties, le proxy pour "http://www.yahoo.com" imprime comme DIRECT. DIRECT signifie pas de procuration. C'est parce que dans le http net.properties file,.proxyHost ' n'est pas défini.

Maintenant, je modifie le fichier net.properties comme suit (un-commentant et modifiant l'existant entrée):

http.proxyHost=this.is.a.test.net

Maintenant, lorsque j'exécute le même code, j'obtiens la sortie suivante:

C:\Program Files\Java\jdk1.8.0_20\jre
null
HTTP Proxies
HTTP @ this.is.a.test.net:80

La propriété System est toujours null, mais le même paramètre du fichier net.properties a pris effet.

Quelques autres observations:

  1. Lors de la définition explicite de la propriété système comme suit: System.setProperty("http.proxyHost", "other.net"); juste avant de faire le ProxySelector::select, remplacera la valeur dans net.properties.
  2. La substitution à l'aide des propriétés système affectera uniquement la même propriété système. Autrement dit, si vous ne remplacez que http.proxyHost, il héritera toujours de http.proxyPort s'il est défini dans net.properties.
  3. Si n'importe où, soit dans le fichier net.properties, soit en définissant explicitement la propriété system dans le code, j'ai défini http.proxyHost explicitement, cela remplacera toujours la valeur par défaut du système même lorsque java.net.useSystemProxies est défini sur true. java.net.useSystemProxies=true ne fonctionne que lorsque le proxy n'est pas explicitement défini, et sera autrement ignoré (j'ai testé et vérifié cela).

[Mise à jour 2]

Si votre but ultime est juste d'accéder le contenu du net.fichier de propriétés, vous pouvez essayer quelque chose comme suit:

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"));
 }
}

Vous trouvez la sécurité et les privilèges!

 6
Author: YoYo, 2015-07-15 22:35:34