2016-04-25 79 views
0

我搞砸了代理設置和JVM。顯然,OS X(我的案例中的Maverics)是JVM(今天的1.8_92)自動應用系統首選項中設置的任何代理的唯一系統。我測試過的任何其他系統(Arch Linux with openbox,沒有Gnome/KDE,Windows 7,一些最新的Debian版本)都沒有這樣做,它可能需要使用'-Djava.net.useSystemProxies' (在Windows上工作),或明確使用'-Dhttp.proxyHost = ...'等設置代理JVM如何自動設置OS X的系統代理工作?

我很確定OS X系統代理被應用,因爲我使用了一個特殊的'marker'代理主機名稱中的偏好;當我更改主機名時,JVM將其代理設置更改爲新的主機名(我需要重新啓動JVM,但在JVM運行時它不會更改,但沒關係)。

我覺得這個行爲很酷(顯然,代理只是開箱即用的OS X,這是刷新後,我與其他系統的問題噸),但它似乎沒有記錄在任何地方。

有人可以確認這是OS X上的JVM誰做的魔術?它發生在哪裏以及由誰發生?我可以想象有多種方法可以實現這一點:用於Mac的JVM可以很聰明,知道如何查找OS X的代理設置,或者在網絡設置發生變化時可以編寫一些配置文件,並且JVM可以在啓動時簡單地讀取它,或...許多選項,但它怎麼實際上工作?

回答

1

有一個GetJavaPropertieslibjava這是取決於實施; Mac OSX共享一般的Unix實現。這用於設置任何系統屬性,以便將它們標記在通用Java屬性(如文件系統的默認編碼等)上。

有一點down the bottom有條件地包含MACOSX調用setProxyProperties使用OSX標準系統配置框架執行代理查找。

一旦知道系統代理信息,它將通過調用鏈回傳到System.c,該代碼表示​​如果發現代理信息,則設置標準Java系統屬性http.proxyPort等。

所以調用堆棧是:

  • Java_java_lang_System_initProperties
  • GetJavaProperties
  • setProxyProperties
  • SCDynamicStoreCopyProxies < - OSX的特定呼叫

其次PUTPROPinitProperties方法如果以上返回的東西。