我很难弄清楚问题出在哪里,所以我发布这篇文章是希望其他人可能已经在其他地方找到了类似的东西,并且愿意分享他们的见解。
我正在使用运行在 Sun Java 1.6.0-13 JDK 之上的 JBoss 5.0.1.GA 应用服务器。对于生成的 Web 服务中的 WAR 文件,我使用 Axis2 1.4 WS 引擎,其 JAR 文件由 Eclipse Galileo 插入项目的 WEB-INF/lib
从动态 Web 项目中给定的“worker”类创建 Web 服务时的目录。相关代码片段如下:
String sUrl = "http://example.com/datafile.xml";
String sPath = "/some/xpath/string";
InputStream input = new URL(sUrl).openStream();
InputSource source = new InputSource(input);
DocumentBuilderFactory docFact = DocumentBuilderFactory.newInstance();
docFact.setNamespaceAware(false);
DocumentBuilder parser = docFact.newDocumentBuilder();
Document doc = parser.parse(source);
XPath xpath = XPathFactory.newInstance().newXPath();
// error occurs here:
String result = (String) xpath.evaluate(path,doc,XPathConstants.STRING);
input.close();
这是我从 JBoss 日志中得到的错误:
java.lang.LinkageError: loader constraint violation: when resolving field "STRING" the class loader (instance of org/jboss/classloader/spi/base/BaseClassLoader) of the referring class, javax/xml/xpath/XPathConstants, and the class loader (instance of <bootloader>) for the field's resolved type, javax/xml/namespace/QName, have different Class objects for that type
我可以使用XPath.evaluate(String,Document)
——但是在某些情况下我需要获取(例如)XPathConstants.NODESET
代替,所以这是不行的。我还试图通过在 WAR 文件中到处乱扔一些 jboss-web.xml
文件来摸索一点,但没有任何效果。
我想了解的是:
- 错误可能来自哪里? JBoss 类加载器? JBoss 和 Sun JDK 之间有些奇怪的交互?在创建 Web 服务时 Eclipse 引入了一些奇怪的东西?可能是 WAR 中部署的 Axis2 库引入了一些混淆?
- 我在看起来像三重打击的情况下找到了已编译类文件的实例:
- Sun JDK(文件
rt.jar
); - JBoss 库(
$JBOSS_HOME/lib/endorsed/stax-api.jar
);和 - Axis2 部署的库(
$JBOSS_HOME/server/deploy/MyProject.ear/MyProject.war/WEB-INF/lib/axis2-saaj-api-1.4.jar
和woden -impl-dom-1.0M8.jar
).
- Sun JDK(文件
- 我究竟应该如何配置 JBoss 来告诉它可以从“其他”库中加载哪些类?具体来说,
jaxax.xml.namespace.QName
是导致问题的原因。
提前谢谢你。
最佳答案
当应用程序的类路径包含 JBoss 认为“ protected ”的类时,JBoss 将抛出一个 LinkageError
,即它不允许应用程序包含它自己的某些关键 API 的副本。
在这种情况下,您的应用程序似乎包含它自己的 javax.xml.xpath
API 副本,并且可能还包含您提到的其他一些副本。
您需要从 EAR/WAR 的 lib 目录中删除与 JBoss 自己的库冲突的所有内容(例如 axis2-saaj-api-1.4.jar
)。
关于java - JBoss5 中的 XPath 类解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3247662/