私は、play フレームワーク (play-1.2.5) をカスタムの Google GUICE ベースのアプリケーション モジュールと一緒に使用するプロジェクトに取り組んでいます。
コードで現在の例外が発生しています。
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
私の現在の分析によると、問題はソース フォルダー構造とアプリケーションの初期化方法に関連しているようです。
私は次の構造を持っています:
project/app/{play コントローラーとモデルなど} project/src/{ビジネス ロジックを実装するプロジェクト固有のクラス}
play アプリケーションを起動するとき、"src" フォルダー内のジョブも起動します (play マネージド アプリケーション クラスの外から)。この時点で、これらのジョブによってアクセスされるモデルやその他のクラスがデフォルトのクラスローダーでロードされ、play アプリケーション クラス (ビューなど) からこれらを使用しようとすると、このエラーが表示されます。使用されるクラスは異なるクラスローダーで作成されているため、異なるシグネチャを持っています。
結論として、デフォルトのクラスローダーとプレイクラスローダーの両方が同じクラスをロードし、それらを呼び出す方法によっては、ミスマッチのエラーが発生します。
すべてのソース ファイルを project/app/ source フォルダーに移動するだけでこれを解決できましたが、src フォルダーを play アプリケーション フォルダーとは別にしたいと思います。
- 私の分析が正しいかどうか誰か知っていますか?
- 1. で「はい」の場合、app フォルダーだけでなく、src フォルダーからもクラスをロードするように play を構成する方法はありますか?
どんな入力でも大歓迎です。