我正在开发一个项目,我们将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 / {播放控制器和模型等} project / src / {我的项目特定类实现业务逻辑}
启动播放应用程序时,我还在“src”文件夹中启动作业(从播放托管应用程序类的外部)。似乎发生的是,这些作业访问的模型和其他类此时加载了默认的类加载器,当我尝试从播放应用程序类(视图等)中使用这些时,我收到此错误告诉我所使用的类是使用不同的类加载器创建的,因此具有不同的签名。
因此,总的来说,默认的类加载器和播放类加载器都加载了相同的类,并且根据我调用它们的方式,我得到了错过匹配的错误。
我已经能够通过简单地将所有源文件移动到project / app / source文件夹来解决这个问题,但我想将src文件夹与play应用程序文件夹分开。
赞赏任何意见。
答案 0 :(得分:1)
您可以尝试将“src”文件夹附加到Play.javaPath列表,让Play编译并加载您的类。