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?
1 answers
Résumé des conclusions
- Le fichier
${java.home}/lib/net.properties
n'est pas chargé dans le Propriétés Système (System::getProperties
). - 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ètrejava.net.useSystemProxies
même s'il est défini surtrue
. - Vous pouvez accéder au fichier
net.properties
en le chargeant manuellement en tant que propriétés en utilisantProperties::load
. L'emplacement exact est dans la maison Java répertoire, qui peut être récupéré en utilisant lejava.home
Propriété System, dans le sous-répertoirelib
. - 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". - 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:
-
jre/lib/net.properties
comme valeur par défaut - À partir des paramètres Internet de votre système (Panneau de configuration, etc.) lorsque
java.net.useSystemProxies
est défini sur true. - 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.
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:
- Lors de la définition explicite de la propriété système comme suit:
System.setProperty("http.proxyHost", "other.net");
juste avant de faire leProxySelector::select
, remplacera la valeur dansnet.properties
. - 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 dehttp.proxyPort
s'il est défini dansnet.properties
. - 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éfinihttp.proxyHost
explicitement, cela remplacera toujours la valeur par défaut du système même lorsquejava.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!