当前位置: 首页 > 面试题库 >

检索Java net.properties文件中定义的默认值

邵旺
2023-03-14
问题内容

如果我正确理解Java Networking and
Proxies
,则该jre/lib/net.properties文件包含默认值,这些默认值在运行时填充到系统属性中。我的net.properties文件包含以下内容:

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

但是,当我在Eclipse
4.5中运行Java应用程序时,会System.getProperty("http.nonProxyHosts")返回null
我尚未在应用程序中的任何地方定义或覆盖此值。

我如何在运行时检索http.nonProxyHostsin 的值jre/lib/net.properties


问题答案:
  1. 该文件${java.home}/lib/net.properties未加载到系统属性(System::getProperties)中。
  2. 通过System.setProperty或在命令行上手动设置代理(例如使用-Dhttp.proxyHost=proxy语法)将覆盖已定义的属性,java.net.useSystemProxies即使设置为,也将覆盖任何设置true
  3. 您可以使用net.properties手动将文件作为属性加载来访问文件Properties::load。确切位置在Java主目录中,可以使用子目录中的“ java.home系统属性” 来检索该lib目录。
  4. 在Windows桌面上,当与结合使用时java.net.useSystemProxies=true,可以在“ Internet属性”下的控制面板中设置要使用的代理。在这些设置中,您需要单击“ LAN设置”按钮。
  5. 小程序具有其他级别的设置,请参阅Java文档中的“ 代理设置 ”。

研究

我已经使用以下简单示例在环境中实际使用netBeans复制了您的示例:

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系统属性以确保编辑正确jre/lib/net.properties

但是,这两个属性http.nonProxyHostsjava.net.useSystemProxies打印为null,而我可以清楚地看到文件中同时设置了两个值net.properties

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

实际上,文档尚不清楚,但是似乎可以通过以下几种方式之一完成代理配置:

  1. jre/lib/net.properties 作为默认
  2. 从系统的Internet设置(控制面板等)java.net.useSystemProxies设置为true时。
  3. 从Java配置(在Java控制面板中进行设置)以及作为Applet运行时,并有可能继承自浏览器设置。
  4. System.properties

在我看来,这是java.net api的一种惯用功能,并且仅在未明确设置系统属性的情况下,才读取net.properties。我怀疑,确实
意味着该net.properties文件是用来设置系统属性,而是由java.net API的本身是只读的。

还请注意默认安装net.properties文件中的以下文本:

该文件可能包含网络系统属性的默认值。仅当未在命令行上指定系统属性或以编程方式设置系统属性时,才使用这些值。

它只是说将 使用 这些值,而没有关于设置系统属性本身的具体信息。

[更新]

通过一个小例子,我能够证明这一点

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

您可以看到http.proxyHost打印为空,而默认情况下net.properties"http://www.yahoo.com"打印的代理为DIRECTDIRECT表示没有代理。这是因为在net.properties file,http.proxyHost中未定义。

现在,我net.properties按如下方式修改文件(取消注释和修改现有条目):

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

现在,当我运行相同的代码时,将得到以下输出:

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

系统属性仍然为空,但是net.properties文件中的相同设置确实生效。

其他一些观察:

  1. 如下明确设置系统属性时:System.setProperty("http.proxyHost", "other.net");在执行之前ProxySelector::select,将覆盖中的值net.properties
  2. 使用系统属性进行覆盖 只会 影响完全相同的系统属性。也就是说,如果您仅覆盖http.proxyHost,则http.proxyPort在设置时仍将继承net.properties
  3. 如果在net.properties文件中的任何位置,或者通过在代码中显式设置system属性,则进行显式设置,http.proxyHost即使java.net.useSystemProxies将其设置为true ,也将始终覆盖System默认值。java.net.useSystemProxies=true仅在未显式设置代理的情况下有效,否则将被忽略(我已经测试并验证了这一点)。

[更新2]

如果您的最终目标只是访问net.properties文件的内容,则可以尝试以下操作:

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

您知道安全性和特权!



 类似资料:
  • 我在使用Gradle api的Gradle自定义插件中工作,需要设置一个始终执行的操作,比如配置任务。 我以这种方式创建了一些任务: 然后添加到项目中: ...这些工作原理是:当我显式调用myWork目标时,它会被执行,但是我需要一个每次都被执行的任务,即使没有显式调用。

  • 问题内容: 如何在Doctrine 2中设置默认值? 问题答案: 数据库默认值不受“便携式”支持。使用数据库默认值的唯一方法是通过mapping属性,在该属性中为字段所映射的列指定代码段(包括原因在内)。 您可以使用: 最好使用PHP级别的默认值,因为这些值也可以在新创建和持久保存的对象上正确使用(持久保存新对象以获取默认值后,Doctrine不会返回数据库)。

  • 当我在JAX-RS中添加字符串的默认值时,它不接受该值。它保持为null或空。 当我将状态传递为空或或未定义时,它将保持为空或或未定义。它不会将默认值视为已确认。

  • 问题内容: 我正在通过映射配置文件配置Hibernate。 如何设置为可为空,默认为null? 问题答案:

  • 我如何从容器到达我的宿主PostgreSQL.conf?或者在哪里可以看到默认的?一位同事给了我他的配置文件,让我把它和我自己的文件进行比较,看看我需要做的一些更改。 容器上的文件路径为: 但我不知道如何将文件从容器拿到我的主机

  • 假设在我的项目中,我有一个文件夹,我不知道里面有多少js文件?有没有办法像这样使用sintax从每个文件导入所有默认值 所以变量模型会有一个对象,其中键是文件的名称和值是默认值,或者我应该分别从每个文件导入? 非常感谢。