【发布时间】:2010-07-14 15:19:28
【问题描述】:
我很难弄清楚问题出在哪里,所以我发布这篇文章是希望其他人可能在其他地方找到类似的东西并愿意分享他们的见解。
我正在使用在 Sun Java 1.6.0-13 JDK 之上运行的 JBoss 5.0.1.GA 应用服务器。对于生成的 Web 服务中的 WAR 文件,我使用 Axis2 1.4 WS 引擎,其 JAR 文件由 Eclipse Galileo 在创建 Web 服务时插入到项目的 WEB-INF/lib 目录中来自动态 Web 项目中给定的“工人”类。相关代码sn -p如下:
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: 加载器约束违规:当解析字段“STRING”时,引用类 javax/xml/xpath/XPathConstants 的类加载器(org/jboss/classloader/spi/base/BaseClassLoader 的实例),字段解析类型 javax/xml/namespace/QName 的类加载器(
的实例)具有该类型的不同 Class 对象
我可以使用XPath.evaluate(String,Document)——但有时我需要(例如)XPathConstants.NODESET,所以这是不行的。我还尝试在 WAR 文件中到处乱扔一些 jboss-web.xml 文件,但没有任何效果。
我想了解的是:
- 错误可能来自哪里? JBoss 类加载器? JBoss 和 Sun JDK 之间的一些奇怪的交互? Eclipse 在创建 Web 服务时引入了一些奇怪的东西?可能是 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正在造成悲痛。
提前谢谢你。
【问题讨论】:
-
还要注意,在JDK的rt.jar中,javax.xml.xpath.XPath是一个接口,所以必须要实现elsehwere...
标签: java xpath jboss classloader