2014-01-11 1 views
2

Я развертываю WAR-файл на сервере Weblogic 12.1.2 на Windows 7 (также пробовал Mac OS X).Как я могу проверить, какой класс/jar вызывает «Не удается наследовать от окончательного класса» во время развертывания WAR?

Я получаю исключение (см. Ниже). похоже, что один из классов относится к более старой/более новой версии некоторого родительского класса, который исходит из некоторой дублированной банки.

Как я могу найти, какой класс или файл jar вызывает его? мой файл WAR имеет кучу Кувшинов в WEB-INF/Lib ...

<Error> <Console> <BEA-240003> <Administration Console encountered the following error: weblogic.application.ModuleException: 
java.lang.VerifyError: Cannot inherit from final class 
    at weblogic.application.internal.ExtensibleModuleWrapper.prepare(ExtensibleModuleWrapper.java:114) 
    at weblogic.application.internal.flow.ModuleListenerInvoker.prepare(ModuleListenerInvoker.java:100) 
    at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleStateDriver.java:172) 
    at weblogic.application.internal.flow.ModuleStateDriver$1.next(ModuleStateDriver.java:167) 
    at weblogic.application.utils.StateMachineDriver$ParallelChange.run(StateMachineDriver.java:80) 
    at weblogic.work.ContextWrap.run(ContextWrap.java:40) 
    at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:550) 
    at weblogic.work.ExecuteThread.execute(ExecuteThread.java:295) 
    at weblogic.work.ExecuteThread.run(ExecuteThread.java:254) 
Caused by: java.lang.VerifyError: Cannot inherit from final class 
    at java.lang.ClassLoader.defineClass1(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:800) 
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
    at weblogic.utils.classloaders.GenericClassLoader.defineClass(GenericClassLoader.java:385) 
    at weblogic.utils.classloaders.GenericClassLoader.findLocalClass(GenericClassLoader.java:344) 
    at weblogic.utils.classloaders.GenericClassLoader.findClass(GenericClassLoader.java:302) 
    at weblogic.utils.classloaders.ChangeAwareClassLoader.findClass(ChangeAwareClassLoader.java:64) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    at weblogic.utils.classloaders.GenericClassLoader.loadClass(GenericClassLoader.java:180) 
    at weblogic.utils.classloaders.ChangeAwareClassLoader.loadClass(ChangeAwareClassLoader.java:43) 
    at com.oracle.injection.integration.BeanLoaderUtils.loadBeanClassesFromJar(BeanLoaderUtils.java:54) 
    at com.oracle.injection.integration.BeanLoaderUtils.loadBeanClassesFromEmbeddedJar(BeanLoaderUtils.java:34) 
    at com.oracle.injection.integration.CDIModuleExtension.loadBeanClassesFromEmbeddedJar(CDIModuleExtension.java:727) 
    at com.oracle.injection.integration.CDIModuleExtension.makeInjectionArchivesForResourceType(CDIModuleExtension.java:526) 
    at com.oracle.injection.integration.CDIModuleExtension.createLibInjectionArchives(CDIModuleExtension.java:486) 
    at com.oracle.injection.integration.CDIModuleExtension.createWebModuleInjectionArchive(CDIModuleExtension.java:193) 
    at com.oracle.injection.integration.CDIModuleExtension.createInjectionArchive(CDIModuleExtension.java:179) 
    at com.oracle.injection.integration.CDIModuleExtension.postPrepare(CDIModuleExtension.java:85) 
    at weblogic.application.internal.ExtensibleModuleWrapper$PrepareStateChange.next(ExtensibleModuleWrapper.java:297) 
    at weblogic.application.internal.ExtensibleModuleWrapper$PrepareStateChange.next(ExtensibleModuleWrapper.java:285) 
    at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:42) 
    at weblogic.application.internal.ExtensibleModuleWrapper.prepare(ExtensibleModuleWrapper.java:109) 
+0

Ничего себе, эта трассировка стека не предлагает никакой помощи. Это отличный урок в том, почему НЕ вернуться и сделать класс, который вы выпустили в финале. Удачи! Я думаю, в теории вы могли бы написать что-то, чтобы загружать каждый класс в каждую банку, пока не нажмете эту проблему. Вам нужно будет установить свой путь класса точно так же, как это имеет место в WebLogic (или, предположительно, ваша сборка поймала бы это). – Todd

+1

Может быть, вы можете попробовать написать отдельный класс загрузчика класса класса с помощью метода main(), чтобы он попытался загружать все классы во все банки из каталога один за другим. Поскольку это отдельная программа, вы можете запустить ее из командной строки и выяснить, какой класс нарушает правило. Вот пример пользовательского загрузчика классов - http://www.codeslices.net/snippets/simple-java-custom-class-loader-implementation – sandeepkunkunuru

ответ

2

Используйте отладчик, и установить точку останова на метания java.lang.VerifyError. В связанной с ClassLoader части трассировки стека, по крайней мере, некоторые из методов должны иметь аргументы, которые позволяют определить, какой класс он пытается (и не удается) загрузить.

В то время как Weblogic является собственностью, Java сама по себе является открытым исходным кодом, поэтому вы можете попытаться сосредоточиться на строках в трассировке стека, начиная с at java. Но теоретически отладчик Java должен даже в некоторой степени отлаживать код с закрытым кодом.

0

У меня такая же проблема. Эта ошибка возникла во время загрузки com.google.common.base.CaseFormat.

Решение

1) добавить com.google.common. * В предпочитать-приложение-пакеты блок в WebLogic-application.xml.

2) также необходимо проверить версия guava. Pre 18 Guava не совместим с средой JEE 6. В моем случае я обновляю guava с 15.0 до 18.0.

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