我很难弄清楚问题的来源,所以我发布这篇文章是希望其他人可能在其他地方找到类似的东西,并且很友好地分享他们的见解。
我正在使用在 Sun Java 1.6.0-13 JDK 之上运行的 JBoss 5.0.1.GA 应用程序服务器。对于生成的Web Service中的WAR文件,我在创建时使用 Axis2 1.4 WS引擎,其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
文件来摸索,但没有效果。
我想要了解的是:
rt.jar
); $JBOSS_HOME/lib/endorsed/stax-api.jar
);和$JBOSS_HOME/server/deploy/MyProject.ear/MyProject.war/WEB-INF/lib/axis2-saaj-api-1.4.jar
和woden-impl-dom-1.0M8.jar
)。jaxax.xml.namespace.QName
正在引发悲痛。提前谢谢。
答案 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如何打包存档文件以进行部署,所以这只是我到目前为止的怀疑。