gpt4 book ai didi

java - 如何欺骗 Java 服务提供者 API (jaxp)

转载 作者:搜寻专家 更新时间:2023-11-01 01:23:53 25 4
gpt4 key购买 nike

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

具体来说,如果它在我的任何应用程序 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 中,但是我如何做到这一点,同时仍然让它使用用户的 JAXP 默认 JRE 实现?或者,有没有办法说服 applet 运行时在我的 JAR 文件中而不是在该文件的 codebase 中?

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

最佳答案

禁用代码库查找:

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

AppletClassLoader 检查 boolean 属性 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

When the applet classloader needs to load a class or resource (for example, configuration files for pluggable service providers under the META-INF/services directory), it first searches for the required files in the applet JAR files and then from the applet codebase. Typically applets are deployed with all the needed classes and resources stored in the applet JAR files. In this case, the codebase lookup is unnecessary.

If the class or resource is not available from the applet JAR files, it may be better to have the classloader fail rather than attempt a codebase lookup. Otherwise, a connection has to be made to the applet codebase to search for the class or resource, and it may have performance impact on the applet runtime.

关于java - 如何欺骗 Java 服务提供者 API (jaxp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4207297/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com