OS X的系统代理的JVM自动设置如何工作?



我在搞乱代理设置和JVM。显然,OS X(在我的例子中是Maverics)是唯一一个JVM(截至今天的1.8_92)自动应用系统首选项中设置的任何代理的系统。我测试过的任何其他系统(带有openbox的Arch Linux,没有Gnome/KDE,Windows 7,一些最新的Debian版本)都不会这样做,要么需要使用"-Djava.net.useSystemProxies"(适用于Windows),要么使用"-Dhttp.proxyHost=..."显式设置代理。等。

我很确定应用了OS X系统代理,因为我在首选项中使用了一个特殊的"标记"代理主机名;当我更改主机名时,JVM将其代理设置更改为新的主机名(我需要重新启动JVM,虽然,当JVM运行时它不会改变,但这没关系)。

我发现这种行为很酷(显然,代理只是在 OS X 上开箱即用,在我遇到其他系统的大量问题之后,它令人耳目一新),但它似乎没有在任何地方记录。

有人可以确认是OS X上的JVM施展魔法吗?它在哪里发生,由谁发生?我可以想象多种实现此目的的方法:适用于 Mac 的 JVM 可能很聪明并且知道如何查找 OS X 的代理设置,或者每当网络设置更改时可能会写入一些配置文件,JVM 可以简单地在启动时读取它,或者......很多选择,但它实际上是如何工作的?

libjava中有一个对 GetJavaProperties 的调用,它依赖于实现;Mac OSX共享通用的Unix实现。这用于设置任何系统属性,以便将它们标记在常规 Java 属性(如文件系统的缺省编码等)上。

底部有条件地包含了一些调用setProxyPropertiesMACOSX,该使用 OSX 标准系统配置框架执行代理查找。

一旦知道系统代理信息,它就会通过调用链传递回System.c,如果找到代理信息,则设置标准 Java 系统属性http.proxyPort等。

因此,调用堆栈为:

  • Java_java_lang_System_initProperties
  • GetJavaProperties
  • setProxyProperties
  • SCDynamicStoreCopyProxies <- OSX 特定调用

后跟 initProperties 方法中的PUTPROP(如果上面返回某些内容)。

最新更新