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

How does JVM automatic setting of OS X's System proxies work?

我正在处理代理设置和 JVM。显然,OS X(在我的例子中是 Maverics)是 JVM(1.8_92 截至今天)自动应用系统首选项中设置的任何代理的唯一系统。我测试过的任何其他系统(Arch Linux with openbox, no Gnome/KDE, Windows 7, some up-to-date Debian version)不要这样做,这是必要的使用“-Djava.net.useSystemProxies”(适用于 Windows),或使用“-Dhttp.proxyHost=...”明确设置代理

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

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

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

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

有一点 down the bottom that is conditionally included for MACOSX that calls setProxyProperties 使用 OSX 标准系统配置框架执行代理查找。

一旦系统代理信息已知,它就会通过调用链向上传递到 System.c,表示是否找到标准 Java 系统属性 http.proxyPort 等. 已设置。

所以调用堆栈是:

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

后面的PUTPROPinitProperties方法如果上面returns什么的。