当前位置: 首页 > 面试题库 >

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

苏富
2023-03-14
问题内容

该环境在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

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并仍然得到相同的错误(不是ClassNotFoundException)。因此,WAS似乎正在使用其自己的副本来解析引用,该副本与我们的已编译类文件中的引用不兼容。但是,我可以找到的“
xercesImpl.jar”的唯一其他实例(除了与我们的应用程序一起部署的副本之外)在directory中deploytool,该目录
似乎在应用程序服务器之外。

我用以下方法扫描了WAS中的所有罐子(共1300个)

for i in `find . -name \*.jar`; do jar tvf $i|grep -qi xerces && echo $i ; done

并发现./java/jre/lib/html" target="_blank">xml.jar包含中的所有类org.apache.xerces.*,因此这可能是在类加载器解析引用的地方。

这是奇怪的部分:

如果我们更改为“父类加载器优先”,则不会看到该异常。这与预期的行为背道而驰。我们希望使用“应用程序类加载器优先”,它将使用我们提供的xercesImpl.jar,并且仅当我们将“父类加载器”设置为“父”时,才使用WAS的版本。这似乎是我们实际看到的倒退。

问题:

类加载器委托设置如何与上述信息交互以导致观察到的行为?


问题答案:

您的WAR还包括org.xml.sax或org.w3c.dom类,然后您引用的应用程序之外的类也引用了这些类。这将建立一个方案,您的应用程序类加载器可以看到同一类的两个实例,这是一个链接错误。

例如,如果您的应用程序使用javax.xml.bind.Unmarshaller.unmarshal(InputSource),则将从JDK加载Unmarshaller,而Unmarshaller类仅对JDK
InputSource具有可见性。当您的应用程序创建其InputSource时,它将从WAR加载类(因为“应用程序优先”策略),然后您的应用程序将尝试将WAR
InputSource的实例传递给JDK Unmarshaller,后者只能接受以下形式的实例: JDK InputSource。

有两种解决方案

  1. 从应用程序中删除所有API jar,然后使用JDK中的API jar。例如,删除包含org.xml.sax或org.w3c.dom的jar。
  2. 在WAR中包括所有引用您要引用的类的库。例如,在您的WAR中包含JAXB库的副本。

以我的经验,很难找到链接错误,因为JVM给出了导致添加链接的原因的糟糕信息。我通常启用类加载器跟踪,重现问题,然后向后走,直到我发现从应用程序外部加载的类“听起来像”,它可能引用了一个已知存在于应用程序内部的类。



 类似资料:
  • 我试图在WAS8.5上部署Web服务,我在启动应用程序时在服务器日志中出现以下异常。此服务以前在WAS7上运行。 我已经将类加载配置更改为parent last并进行了测试,但运气不好。我有泽西服务器1.9。1在我的大会中。 有人知道这件事吗? 提前谢谢。 [3/7/14 6:42:30:854 CST]00000067 FFDCW公司。国际商用机器公司ws。ffdc。impl。FfdcProvi

  • 问题内容: 我遇到了一个项目有两次相同的.jar(对于我来说,是el-api.jar v2.1)两次的问题,因此,当我尝试使用Tomcat 6运行项目时,出现了以下错误堆栈。 我发现了 http://blog.springsource.com/2008/10/20/understanding-the-osgi-uses- directive/ 但这没有用,因为解决方案影响了我项目的太多部分。 我无

  • 帮助我如何解决这个问题?我正在使用java进行NetSuite集成,我将所需的jar文件添加到我的项目中。添加jboss 6.1.0中部署的jar后。添加此jar后org.apache.sling.commons.log-2.0.6.jar获得以下异常。这是我的堆栈跟踪。

  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?

  • 以下是SQL部分,我在调试代码时出错: ORA-00001:唯一约束主键违反T_LIAV_AGENT_STATE_APPROVAL... 这是主键约束依赖的2列AV_NAME_ID,AV_STATE... 我没有重复的数据...你认为还有其他原因吗?

  • 我有两张表, 但我做了一个组声明,以确保from\t的名称是唯一的: 我不确定我是否正确理解了这个问题。我尽了我所能,但仍然没有运气。