2015-09-18 3 views
1

Мой код отлично работает в Jetty, но как только я раскрываю в WebSphere, я получаю исключение a java.lang.VerifyError без дополнительных сведений на всех (даже не сообщение) ,java.lang.VerifyError на XPAthConstants.NODESET в WebSphere, но не в Jetty

Код:

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

Это поможет людям, пытающимся ответить, если была предоставлена ​​полная трассировка стека ошибки. – Alasdair

+0

Выполнено, но, как я уже сказал, я сомневаюсь, что это полезно, поскольку 'VerifyError' пуст и не дает никакой подсказки. –

ответ

0

Отсутствующий VerifyError сообщение дефект JVM, и вы должны сообщить об этом в команде Java.

Это, скорее всего, ошибка сцепления класса. Вероятно, у вас есть JAR в вашем пути к классу, который содержит javax.xml.namespace.QName, и он предпочитает копию из Liberty (например, вы можете использовать <classloader delegation="parentLast"/>). Это ситуация:

  1. классы Применение:

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

    • javax.xml.xpath.XPathConstants
    • javax.xml.namespace.QName

Есть два класса QName, но загрузчики классов могут ссылаться только на один из них; если вы попытаетесь связаться с обоими, вы получите сообщение об ошибке. Когда вы используете отражение для доступа к полю NODESET, вы запрашиваете загрузчика класса Liberty/JDK для разрешения поля QName от имени XPathConstants. Когда вы используете ссылку с прямым полем, вы также попросите своего загрузчика класса приложения разрешить класс XPathConstants (который он находит из Liberty/JDK), а также класс QName (который он находит в другом месте, чем класс Liberty/JDK loader нашел его при связывании QName с XPathConstants).

Вам нужно либо:

  1. Удалить parentLast (или что-то, что вызывает повторяющиеся нагрузки класса QName)
  2. Удалите JAR, содержащий дубликат класса javax.xml.namespace.QName из вашего класса приложения пути
  3. Добавьте JAR, содержащий дубликат javax.xml.xpath.XPathConstants класс в путь класса приложения, так что вы полностью (а не частично) дублировать иерархию классов

(Если этот анализ верен, то это прискорбно, что JVM бросает VerifyError, а не более конкретного LinkageError.)

 Смежные вопросы

  • Нет связанных вопросов^_^