2012-11-30 51 views
0

當使用Weblogic 11G時,我遇到了以下錯誤。Weblogic 11G:java.lang.NoSuchMethodError:javax.persistence.OneToMany.orphanRemoval()

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持久性,1.0.2.GA.jar的Hibernate JPA-2.0-API 1.0.1.Final.jar jar文件,這休眠,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> 

如此看來,我需要告訴服務器從休眠-JPA-2.0-API 1.0.1.Final.jar,而不是加載所需的類ejb3-persistence-1.0.2.GA.jar文件,但我不知道該怎麼做?

您的幫助將不勝感激。

回答

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())); 
    } 

將這個方法主要類和正在給這個錯誤時,系統執行它的路徑。它將向您顯示解決依賴關係的所有路徑。找出是否有任何路徑具有較舊版本的jar。

希望這可以幫助你的事業。

1

似乎在類路徑中存在類加載器層次結構中較高類的不同版本。 Weblogic本身有一堆嵌入到標準weblogic安裝中的庫。驗證使用-verbose JVM選項來查看類加載的位置。如果是這樣的話,比使用weblogic部署描述符類加載過濾應該解決您的問題,你實際上。 (因爲庫中的shiped位於系統類路徑上,所以它們優先於存檔中的任何其他庫)。使用這個類加載過濾,你可以打破這一點,並獲得正確的版本加載。我猜不同的容器有不同的標籤。使用weblogic文檔進行檢查。

希望這會有所幫助。