【问题标题】:XPath class resolution in JBoss5JBoss5 中的 XPath 类解析
【发布时间】: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.jarwoden-impl-dom-1.0M8.jar)。
  • 我应该如何配置 JBoss 以告诉它可以从“其他”库加载哪些类?具体来说,jaxax.xml.namespace.QName 正在造成悲痛。

提前谢谢你。

【问题讨论】:

  • 还要注意,在JDK的rt.jar中,javax.xml.xpath.XPath是一个接口,所以必须要实现elsehwere...

标签: java xpath jboss classloader


【解决方案1】:

当应用程序的类路径包含 JBoss 认为“受保护”的类时,JBoss 将抛出 LinkageError,即它不允许应用程序包含自己的某些关键 API 的副本。

在这种情况下,您的应用似乎包含自己的 javax.xml.xpath API 副本,并且可能还包含其他一些副本,正如您所提到的。

您需要从 EAR/WAR 的 lib 目录中删除与 JBoss 自己的库冲突的任何内容(例如 axis2-saaj-api-1.4.jar)。

【讨论】:

    【解决方案2】:

    看来问题已通过从已部署的 Axis2 JAR 文件中删除 javax.xml.namespace.* 包和相应的类来解决。即,使用 Axis2 1.4.1(而不是 1.4),我重新打包了这些 JAR 文件:

    • axis2-saaj-api-1.4.1.jar,通过删除 javax.xml.namespace
    • woden-impl-dom-1.0M8.jar,通过删除 javax

    此外,Eclipse 对项目配置非常挑剔。到目前为止,我发现动态 Web 项目的 Project Facet 必须 使用版本 2.4 的动态 Web 模块(而不是它所建议的 2.5)创建默认),但使用 Java 版本 6(与使用的 JDK 的分支相同)。我不知道为什么会发生这种情况,我想动态 Web 模块 2.4 版默认与 Eclipse 中的 Java 1.4 捆绑在一起是所有混乱的来源。一些谷歌搜索让我相信包 javax.xml 直到 Java 5 或 Java 6 才被合并到 JDK 中——因此可能会混淆!但是,我没有足够的知识来调查问题是否来自 Eclipse 如何打包存档文件以进行部署,所以这只是我目前的怀疑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-18
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多