我想在Webapp项目中使用JDOM。这很好用。但是现在我想用XPath添加一些东西,但是如果我尝试使用XPath,我只是得到一个例外:
com.ibm.ws.webcontainer.servlet.ServletWrapper service SRVE0068E: Uncaught exception created in one of the service methods of the servlet MyServlet in application MyProjectEAR. Exception created : java.lang.NoClassDefFoundError: org.jaxen.BaseXPath
at java.lang.J9VMInternals.verifyImpl(Native Method)
at java.lang.J9VMInternals.verify(J9VMInternals.java:72)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:134)
at java.lang.Class.forNameImpl(Native Method)
at java.lang.Class.forName(Class.java:136)
at org.jdom.xpath.XPath.newInstance(XPath.java:126)
at org.jdom.xpath.XPath.selectNodes(XPath.java:337)
[..]
Caused by: java.lang.ClassNotFoundException: org.jaxen.BaseXPath
at java.net.URLClassLoader.findClass(URLClassLoader.java:421)
at com.ibm.ws.bootstrap.ExtClassLoader.findClass(ExtClassLoader.java:150)
at java.lang.ClassLoader.loadClass(ClassLoader.java:652)
at com.ibm.ws.bootstrap.ExtClassLoader.loadClass(ExtClassLoader.java:90)
at java.lang.ClassLoader.loadClass(ClassLoader.java:618)
at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:62)
at com.ibm.ws.classloader.ProtectionClassLoader.loadClass(ProtectionClassLoader.java:58)
at com.ibm.ws.classloader.CompoundClassLoader.loadClass(CompoundClassLoader.java:540)
at java.lang.ClassLoader.loadClass(ClassLoader.java:618)
... 35 more
jaxen.jar在我的类路径中,而org.jaxen.BaseXPath类就可以了。为什么Websphere找不到它?它适用于我在那里的所有其他库。当谷歌搜索我发现this,有人说他在某处有一个冲突的版本,我应该确保我的网络应用程序目录中的罐子具有优先权。在eclise的“内置路径配置”中,我将Web应用程序库设置在WebSphere库之上(现在只有src目录位于Web应用程序库之上),但这并没有改变任何内容。不幸的是,我并不真正理解关于EAR的部分,这似乎很重要......?
更新:与此同时this给了我一个新线索。我在WebSphere的管理控制台上找到了类路径和包含类加载器所考虑的所有jar的列表。这些都是一个数字,我用一个小grep和unzip -l魔法搜索它们,并认为文件/opt/ibm/WebSphere/PortalServer/wcm/prereq.wcm/wcm/shared/app/jdom.jar包含jdom(没有jaxen的东西)。也许这个jdom jar是加载的,但是从我的lib目录加载了一个不兼容版本的jaxen?
此外,我在WebSphere的管理控制台中找到了我的应用程序的“父优先/最后”设置,但所有内容都显示为灰色!我最后无法切换到父级: - (。
我该怎么做才能找到并解决问题?