0

使用 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)

让我给你更多的细节。我的 web 应用程序包含ejb3-persistence-1.0.2.GA.jarhibernate-jpa-2.0-api-1.0.1.Final.jar jar 文件,在这个hibernate-jpa-2.0-api-1.0.1.Final 中。 jar包含orphanRemoval()方法,而ejb3-persistence-1.0.2.GA.jar没有。

我已通过以下规范将 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文件加载所需的类,但我不知道方式要做到这一点?

您的帮助将不胜感激。

4

2 回答 2

1

似乎在类路径上有不同版本的类,在类加载器层次结构中更高。Weblogic 本身有一堆库嵌入到标准 weblogic 安装中。要验证使用 -verbose JVM 选项来查看类的加载位置。如果是这种情况,那么使用 weblogic 部署描述符类加载过滤应该可以解决您的问题。(因为库中提供的库位于系统类路径中,它们优先于存档中的任何其他库)。使用这个类加载过滤,您可以打破它并加载正确的版本。我猜不同的容器有不同的标签。检查 weblogic 文档。

希望这可以帮助。

于 2013-05-23T13:54:05.400 回答
1

如果加载的 jar 出现问题,则会发生 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()));
    }

将此方法放在 Main 类中并在出现此错误的系统中执行它。它将向您显示解决依赖关系的所有路径。找出是否有任何路径具有旧版本的 jar。

希望这对您的事业有所帮助。

于 2012-11-30T14:18:18.833 回答