我的代码在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
XPathConstants
是xml.jar
附带的JRE
的一部分。 Jetty
和WebSphere
都使用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)
答案 0 :(得分:0)
缺少的VerifyError消息是JVM缺陷,您应该将其报告给Java团队。
这很可能是类链接错误。您的类路径中很可能有一个包含javax.xml.namespace.QName的JAR,并且它优先于Liberty的副本(例如,您可能正在使用<classloader delegation="parentLast"/>
)。情况就是这样:
申请类:
自由/ JDK
有两个QName类,但类加载器可能只链接到其中一个;如果您尝试链接到两者,您将收到错误。当您使用反射来访问NODESET字段时,您只需要Liberty / JDK类加载器代表XPathConstants解析QName字段。当您使用直接字段引用时,您还要求您的应用程序类加载器解析XPathConstants类(它从Liberty / JDK中找到)以及QName类(它在Liberty / JDK类之外的其他位置找到)在将QName链接到XPathConstants时找到了它。
您需要:
(如果这个分析是正确的,那么很遗憾JVM抛出VerifyError而不是更具体的LinkageError。)