4

我有一个需要调用 JAXP 的小程序,特别是SAXParserFactory。现在,正如您从 Javadoc 中看到的那样,这在内部使用了服务提供者机制,如此所述:

具体来说,如果它在我调用的任何应用程序 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://www.example.com/myapp/META-INF/services/javax.xml.parsers.SAXParserFactory发出 HTTP 请求

我宁愿它不这样做,特别是因为我的小程序已签名,并且这个额外的 HTTP 调用会触发关于unsigned code的警告。

现在,显而易见的解决方案是像它说的那样将 META-INF/services 文件放在我的应用程序 JAR 中,但是我该怎么做却仍然让它使用用户的 JRE 默认实现的 JAXP?或者,有没有办法说服小程序运行时查看我的 JAR 文件而不是codebase该文件?

注意:我知道我也可以部署我自己的 JAXP-RI 副本,但这对于 applet 来说是相当重量级的。

4

1 回答 1

11

禁用代码库查找:

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

布尔属性的AppletClassLoader检查sun.applet.AppletClassLoader.codebaseLookup,可以通过设置上述参数来影响。该方法sun.applet.AppletPanel.init()将读取参数并将其设置为AppletClassLoader. 一旦禁用,AppletClassLoader 将停止对代码库中的类和资源进行远程查找,即由给出的 URL,codebase="http://www.example.com/myapp/"并且仅查看档案和系统类路径。

注意:我自己没有对此进行测试,但根据反汇编代码中的代码审查,我真的相信它可以工作。

JavaSE - Technical Notes - Plugin Developer Guide - Special Attributes中也记录了它:

codebase_lookup

当小程序类加载器需要加载一个类或资源(例如,META-INF/services 目录下的可插拔服务提供者的配置文件)时,它首先在小程序 JAR 文件中搜索所需文件,然后从小程序代码库中搜索。通常,小程序部署时所有需要的类和资源都存储在小程序 JAR 文件中。在这种情况下,代码库查找是不必要的。

如果类或资源在 applet JAR 文件中不可用,最好让类加载器失败而不是尝试代码库查找。否则,必须与小程序代码库建立连接以搜索类或资源,这可能会对小程序运行时产生性能影响。

于 2010-11-17T20:59:09.157 回答