Java中的XPAthConstants.NODESET上的java.lang.VerifyError但不在Jetty中

时间:2015-09-18 10:32:42

标签: java websphere websphere-8 verifyerror

我的代码在Jetty中工作正常,但是一旦我在WebSphere中部署,我就会得到a java.lang.VerifyError异常而根本没有额外的信息(甚至不是消息)。

代码:

Class c = Class.forName("javax.xml.xpath.XPathConstants"); // This works
System.out.println(c.getDeclaredFields()); // This works
System.out.println(c.getDeclaredField("NODESET")); // This works (public static final javax.xml.namespace.QName javax.xml.xpath.XPathConstants.NODESET)
System.out.println(XPathConstants.NODESET); // This fails with an empty java.lang.VeryfyError

XPathConstantsxml.jar附带的JRE的一部分。 JettyWebSphere都使用IBM SDK 7运行,代码使用相同的版本进行编译。

我不知道它可能来自哪里。谢谢你的帮助。

这是StackTrace,虽然它没有说明,因为VerifyError是空的

[9/17/15 4:56:01:730 CDT] 000001c0 SystemOut     O java.lang.VerifyError
[9/17/15 4:56:01:731 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.filenet.linker.LinkerDocumentLevel.findRelationships(LinkerDocumentLevel.java:1352)
[9/17/15 4:56:01:731 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.filenet.linker.LinkerDocumentLevel.buildKeyDefCache(LinkerDocumentLevel.java:1119)
[9/17/15 4:56:01:731 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.filenet.linker.LinkerDocumentLevel.checkForKeys(LinkerDocumentLevel.java:748)
[9/17/15 4:56:01:731 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.filenet.parallel.cmd.LinkRefreshCommand.refreshLinks(LinkRefreshCommand.java:224)
[9/17/15 4:56:01:732 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.filenet.parallel.cmd.LinkRefreshCommand.access$1(LinkRefreshCommand.java:197)
[9/17/15 4:56:01:732 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.filenet.parallel.cmd.LinkRefreshCommand$1.call(LinkRefreshCommand.java:161)
[9/17/15 4:56:01:732 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.filenet.parallel.cmd.LinkRefreshCommand$1.call(LinkRefreshCommand.java:1)
[9/17/15 4:56:01:732 CDT] 000001c0 SystemOut     O      at com.ibm.idwb.common.parallel.executor.CountableTask.call(Unknown Source)
[9/17/15 4:56:01:733 CDT] 000001c0 SystemOut     O      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:345)
[9/17/15 4:56:01:733 CDT] 000001c0 SystemOut     O      at java.util.concurrent.FutureTask.run(FutureTask.java:177)
[9/17/15 4:56:01:733 CDT] 000001c0 SystemOut     O      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1121)
[9/17/15 4:56:01:733 CDT] 000001c0 SystemOut     O      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
[9/17/15 4:56:01:734 CDT] 000001c0 SystemOut     O      at java.lang.Thread.run(Thread.java:777)

1 个答案:

答案 0 :(得分:0)

缺少的VerifyError消息是JVM缺陷,您应该将其报告给Java团队。

这很可能是类链接错误。您的类路径中很可能有一个包含javax.xml.namespace.QName的JAR,并且它优先于Liberty的副本(例如,您可能正在使用<classloader delegation="parentLast"/>)。情况就是这样:

  1. 申请类:

    • com.ibm.idwb.common.filenet.linker.LinkerDocumentLevel
    • javax.xml.namespace.QName中
  2. 自由/ JDK

    • javax.xml.xpath.XPathConstants
    • javax.xml.namespace.QName中
  3. 有两个QName类,但类加载器可能只链接到其中一个;如果您尝试链接到两者,您将收到错误。当您使用反射来访问NODESET字段时,您只需要Liberty / JDK类加载器代表XPathConstants解析QName字段。当您使用直接字段引用时,您还要求您的应用程序类加载器解析XPathConstants类(它从Liberty / JDK中找到)以及QName类(它在Liberty / JDK类之外的其他位置找到)在将QName链接到XPathConstants时找到了它。

    您需要:

    1. 删除parentLast(或导致重复的QName类加载的任何内容)
    2. 从应用程序类路径中删除包含重复的javax.xml.namespace.QName类的JAR
    3. 将包含重复的javax.xml.xpath.XPathConstants类的JAR添加到应用程序类路径,以便您完全(而不是部分)复制类层次结构
    4. (如果这个分析是正确的,那么很遗憾JVM抛出VerifyError而不是更具体的LinkageError。)