【发布时间】:2011-02-21 03:40:24
【问题描述】:
环境是 Linux 上的 WAS 6.1,部署一个 webapp,使用 来自 xercesImpl.jar 的类。
由于公司政策限制,该应用必须部署 设置:
Class Loader Order
Classes loaded with parent class loader first
-> Classes loaded with application class loader first
WAR class loader policy
Class loader for each WAR file in application
-> Single class loader for application
WAR 文件包含 xercesImpl.jar 的副本,与 编译应用时位于类路径中。
当启动 webapp 时,当 Spring 尝试解析它的配置时,它 抛出:
java.lang.VerifyError: class loading constraint violated
(class: org/apache/xerces/jaxp/DocumentBuilderImpl
method: parse(Lorg/xml/sax/InputSource;)Lorg/w3c/dom/Document;)
目前的分析
WAS 似乎提供了一个实现
org.apache.xerces.jaxp.DocumentBuilderImpl,因为我们可以去掉
WAR 文件中的 xercesImpl.jar 仍然得到相同的错误(不是
类NotFoundException)。因此 WAS 似乎正在解决参考
使用与我们的参考文献不兼容的自己的副本
编译的类文件。但是,“xercesImpl.jar”的唯一其他实例
我可以找到(与我们的应用程序一起部署的副本除外)在目录中
deploytool,好像在应用服务器之外。
我用
扫描了 WAS 中的所有罐子(全部 1300 个)for i in `find . -name \*.jar`; do jar tvf $i|grep -qi xerces && echo $i ; done
发现./java/jre/lib/xml.jar包含了org.apache.xerces.*中的所有类,
所以这很可能是类加载器解析引用的地方。
这是奇怪的部分:
如果我们更改为“先加载父类加载器”,我们不会看到异常。 这与预期的行为背道而驰。我们希望与 “应用程序类加载器优先”它将使用我们的 xercesImpl.jar 提供,并且仅当我们设置“父类加载器”时才使用 WAS 的版本 首先”。这似乎与我们实际看到的相反。
问题:
类加载器委托设置如何与上述信息交互以产生观察到的行为?
【问题讨论】:
-
这听起来不错。如果我理解你的话,问题不在于 DocumentBuilderImpl,而是在 WAR 中找到它引用的类之一时,它正在从 JDK 中解决。这不能解释为什么当我们在 WAR 中包含 xercesImpl.jar 时,我们仍然会得到完全相同的错误,引用相同的方法和类名。你是说消息中引用的方法和类名与问题无关?
标签: java websphere classloader verifyerror