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

时间:2015-07-11 17:59:53

标签: java eclipse proxy network-programming environment-variables

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

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

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

如何在运行时检索http.nonProxyHosts中定义的jre/lib/net.properties的值?

1 个答案:

答案 0 :(得分:6)

结论摘要

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

    我已经在我的环境中复制了你的例子,实际上是使用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. java.net.useSystemProxies设置为true时,从系统的互联网设置(控制面板等)。
    3. 来自Java配置,在Java控制面板中设置,以及作为Applet运行时,并且可能从您的浏览器设置继承。
    4. System.properties
    5. 在我看来,这是java.net api的一个cusom功能,只有在未明确设置系统属性的情况下才会读取net.properties。我怀疑是否意味着net.properties文件用于设置系统属性,但只能由java.net api自己读取。

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

        

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

      它只表示这些值将使用,没有具体关于设置系统属性本身。

      [UPDATE]

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

      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文件中的任何地方,或者通过在代码中显式设置系统属性,我明确设置了http.proxyHost,即使java.net.useSystemProxiesjava.net.useSystemProxies=true,它也会一直覆盖系统默认值设为true。 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")); } } 仅在未明确设置代理时有效,否则将被忽略(我已对此进行了测试和验证)。
      4. [更新2]

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

        immutable.Map

        你找出了安全和特权!