Weblogic 11G: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()

При использовании Weblogic 11G я сталкиваюсь с ошибкой ниже.

weblogic.application.ModuleException: 
at weblogic.servlet.internal.WebAppModule.startContexts(WebAppModule.java:1514)
at weblogic.servlet.internal.WebAppModule.start(WebAppModule.java:486)
at weblogic.application.internal.flow.ModuleStateDriver$3.next(ModuleStateDriver.java:425)
at weblogic.application.utils.StateMachineDriver.nextState(StateMachineDriver.java:41)
at weblogic.application.internal.flow.ModuleStateDriver.start(ModuleStateDriver.java:119)
Truncated. see log file for complete stacktrace

Caused By: java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1912)
at org.hibernate.cfg.AnnotationBinder.processIdPropertiesIfNotAlready(AnnotationBinder.java:79
at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:707)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processAnnotatedClassesQueue(Configuration.java:4035)
at org.hibernate.cfg.Configuration$MetadataSourceQueue.processMetadata(Configuration.java:3989)

Позвольте мне рассказать вам больше деталей. Мое веб-приложение содержит файлы jar ejb3-persistence-1.0.2.GA.jar и hibernate-jpa-2.0-api-1.0.1.Final.jar, среди которых hibernate-jpa-2.0-api-1.0.1.Final.jar содержит метод orphanRemoval(), а ejb3-persistence-1.0.2.GA.jar< /strong> нет.

Я настроил weblogic для загрузки библиотеки приложений вместо библиотек weblogic по приведенной ниже спецификации.

weblogic-application.xml

<prefer-application-packages>
    <package-name>antlr.*</package-name>
    <package-name>org.mozilla.javascript.*</package-name>
    <package-name>org.mozilla.classfile.*</package-name>
    <package-name>javax.persistence.*</package-name>
</prefer-application-packages>

Итак, кажется, мне нужно указать серверу загружать требуемый класс из hibernate-jpa-2.0-api-1.0.1.Final.jar вместо ejb3-persistence-1.0.2.GA. .jar, но я не знаю, как это сделать?

Ваша помощь будет оценена по достоинству.


person Ketan    schedule 30.11.2012    source источник


Ответы (2)


java.lang.NoSuchMethodError возникает, если есть какая-то проблема с загруженным банком. Я думаю, что в системе, в которой вы пытаетесь запустить этот код, CLASSPATH установлен на какой-то путь, который загружает более старую версию jar. Используйте следующий код, чтобы узнать пути, по которым ClassLoader разрешает зависимости

public static void main(String[] args) {
            URLClassLoader classLoader = (URLClassLoader)Main.class.getClassLoader();
            System.out.println(Arrays.toString(classLoader.getURLs()));
    }

Поместите этот метод в основной класс и выполните его в системе, которая выдает эту ошибку. Он покажет вам все пути, откуда были разрешены зависимости. Узнайте, есть ли на каком-либо из путей более старая версия jar.

Надеюсь, это поможет вашему делу.

person Narendra Pathai    schedule 30.11.2012

Кажется, что в пути к классам есть другая версия класса, которая находится выше в иерархии загрузчика классов. Сам Weblogic имеет множество библиотек, встроенных в стандартную установку weblogic. Чтобы убедиться в этом, используйте параметр -verbose JVM, чтобы увидеть, откуда загружается класс. Если это так, то использование фильтрации загрузки классов дескриптора развертывания weblogic должно решить вашу проблему, как вы это делаете на самом деле. (поскольку поставляемые библиотеки находятся в системном пути к классам, они имеют приоритет перед любой другой библиотекой в ​​вашем архиве). Используя эту фильтрацию загрузки классов, вы можете сломать это и загрузить правильную версию. Я думаю, у разных контейнеров разные теги. Проверьте документацию weblogic.

Надеюсь это поможет.

person jaksky    schedule 23.05.2013