2012-08-28 96 views
0

我正在開發一個項目,在該項目中我們將基於自定義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. 有人知道我的分析是否正確嗎?
  2. 如果1.上的「是」,是否有配置播放的方法,不僅可以從app文件夾加載類,還可以從我的src文件夾加載類?

任何輸入表示讚賞。

回答

1

你可以嘗試將你的「src」文件夾附加到Play.javaPath列表中讓Play編譯並加載你的類。