JBoss5中的XPath类解析

时间:2010-07-14 15:19:29

标签: java xpath jboss classloader

我很难弄清楚问题的来源,所以我发布这篇文章是希望其他人可能在其他地方找到类似的东西,并且很友好地分享他们的见解。

我正在使用在 Sun Java 1.6.0-13 JDK 之上运行的 JBoss 5.0.1.GA 应用程序服务器。对于生成的Web Service中的WAR文件,我在创建时使用 Axis2 1.4 WS引擎,其 Eclipse Galileo 将JAR文件插入到项目的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:加载器约束违规:当解析字段“STRING”引用类的类加载器(org / jboss / classloader / spi / base / BaseClassLoader的实例)时,javax / xml / xpath / XPathConstants,和字段的已解析类型的类加载器(< bootloader>的实例),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正在引发悲痛。

提前谢谢。

2 个答案:

答案 0 :(得分:7)

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

在这种情况下,您的app看起来像是自己的javax.xml.xpath API副本,也可能包含其他一些副本,如您所说。

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

答案 1 :(得分:4)

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