相关疑难解决方法(0)

WAS 6.1 java.lang.VerifyError:违反了类加载约束

环境是Linux上的WAS 6.1,部署了一个使用xercesImpl.jar类的webapp.

由于公司政策限制,必须使用以下设置部署应用:

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
Run Code Online (Sandbox Code Playgroud)

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;)
Run Code Online (Sandbox Code Playgroud)

因此分析

看来WAS提供了org.apache.xerces.jaxp.DocumentBuilderImpl的实现,因为我们可以从WAR文件中删除xercesImpl.jar并仍然得到相同的错误(不是ClassNotFoundException).因此,WAS似乎使用自己的副本来解析引用,该副本与我们编译的类文件中的引用不兼容.但是,我能找到的'xercesImpl.jar'的唯一其他实例(除了使用我们的应用程序部署的副本)位于目录中 deploytool,这似乎在应用服务器之外.

我用WAS(所有1300个)扫描了所有的罐子

for i in `find . -name \*.jar`; do jar tvf $i|grep -qi xerces && echo $i ; done
Run Code Online (Sandbox Code Playgroud)

并发现它./java/jre/lib/xml.jar包含所有类org.apache.xerces.*,因此这可能是类加载器解析引用的地方.

这是肮脏的部分:

如果我们改为"父类加载器第一",我们看不到异常.这与预期的行为背道而驰.我们希望使用"application …

java websphere classloader verifyerror

10
推荐指数
1
解决办法
3万
查看次数

标签 统计

classloader ×1

java ×1

verifyerror ×1

websphere ×1