2010-11-17 17 views
4

我有一個需要調用JAXP的applet,具體爲SAXParserFactory。現在,你可以從Javadoc中看到,這在內部使用服務提供商機制記載here如何愚弄Java服務提供商API(jaxp)

具體來說,如果沒有找到任何我的應用程序JAR文件的稱爲META-INF/services/javax.xml.parsers.SAXParserFactory一個文件時,它會試圖從獲取它我應用程序代碼庫。如果我有我的小應用程序部署如下:

<applet code="com.example.applets.MyApplet" 
codebase="http://www.example.com/myapp/" archive="myapp.jar, dom4j.jar"> 

然後,它會嘗試讓一個HTTP請求到http://www.example.com/myapp/META-INF/services/javax.xml.parsers.SAXParserFactory

我寧願它沒有這樣做,特別是因爲我的小程序簽署與本附加HTTP通話會觸發關於unsigned code的警告。

現在,顯而易見的解決方案就是將META-INF/services文件放入我的應用程序JAR中,但是如何執行此操作,但仍然可以使用JAXP的用戶JRE默認實現?或者,有沒有辦法說服小程序運行時只在我的JAR文件中看到,而不是在那個文件的codebase

注意:我知道我也可以部署我自己的JAXP-RI副本,但是這對於一個applet來說是相當重的。

回答

11

禁用代碼庫查找:

<applet ...> 
<param name="codebase_lookup" value="false"> 
</applet> 

AppletClassLoader檢查一個布爾屬性sun.applet.AppletClassLoader.codebaseLookup,這可以通過設置上述參數的影響。方法sun.applet.AppletPanel.init()將讀取參數並將其設置爲AppletClassLoader。一旦禁用,AppletClassLoader將停止對代碼庫中的類和資源進行遠程查找,即codebase="http://www.example.com/myapp/"給出的URL,並且只查看歸檔和系統類路徑。

注:我沒有自己測試,但根據反彙編代碼中的代碼審查,我真的相信它可以工作。

它也記錄了JavaSE - Technical Notes - Plugin Developer Guide - Special Attributes

codebase_lookup

當Applet類加載器需要加載META-INF下一個類或資源(例如,配置文件可插入的服務提供商/服務目錄),它首先在小應用程序JAR文件中搜索所需的文件,然後從小應用程序代碼庫中搜索。通常,小應用程序會部署在小應用程序JAR文件中所需的所有類和資源中。在這種情況下,代碼庫查找是不必要的。

如果applet JAR文件中沒有類或資源,則類加載器失敗可能會更好,而不是嘗試進行代碼庫查找。否則,必須建立與小應用程序代碼庫的連接以搜索類或資源,並且可能會對小應用程序運行時產生性能影響。

+0

看起來很有希望。我會嘗試併發布更新! – Dan 2010-11-17 21:11:15

+0

這工作。接受答案。 – Dan 2010-11-18 20:55:02

+0

它也適用於我。謝謝! – 2014-09-08 16:44:57