2010-11-17 28 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