我正在開發一個項目,在該項目中我們將基於自定義Google GUICE的應用程序模塊與play framework(play-1.2.5)一起使用。與默認類加載器和PlayFramework自定義類加載器衝突
我得到當前的異常在我的代碼:
play.exceptions.JavaExecutionException: loader constraint violation: when resolving method "mypackage.Runner.queueJob(Lmodels/Job;)V" the class loader (instance of play/classloading/ApplicationClassloader) of the current class, controllers/Jobs, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, mypackage/Runner, have different Class objects for the type models/Job used in the signature
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:237)
at Invocation.HTTP Request(Play!)
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "mypackage.Runner.queueJob(Lmodels/Job;)V" the class loader (instance of play/classloading/ApplicationClassloader) of the current class, controllers/Job, and the class loader (instance of sun/misc/Launcher$AppClassLoader) for resolved class, mypackage/Runner, have different Class objects for the type models/Job used in the signature
at controllers.Jobs.listJobs(Jobs.java:19)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:557)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:508)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:484)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:479)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
... 1 more
根據我目前的分析,好像這個問題是關係到源文件夾結構和應用程序是如何初始化。
我有以下結構:
項目/應用/ {播放控制器和模型等} 項目/ src目錄/ {我的項目的具體類實現業務邏輯}
當開始播放應用我還在我的「src」文件夾中啓動作業(來自播放託管應用程序類以外的作業)。看起來會發生的情況是,這些作業訪問的模型和其他類此時會用默認的類加載器加載,當我嘗試從播放應用程序類(視圖等)使用這些時,我得到此錯誤告訴我所使用的類是使用不同的類加載器創建的,因此具有不同的簽名。
因此總之,默認的類加載器和play類加載器加載相同的類,並根據我如何調用它們,我得到錯誤匹配的錯誤。
我已經能夠通過簡單地將我的所有源文件移動到項目/應用程序/源文件夾中解決此問題,但我希望將src文件夾與播放應用程序文件夾分開。
- 有人知道我的分析是否正確嗎?
- 如果1.上的「是」,是否有配置播放的方法,不僅可以從app文件夾加載類,還可以從我的src文件夾加載類?
任何輸入表示讚賞。