与默认类加载器和PlayFramework自定义类加载器冲突

时间:2012-08-28 05:26:34

标签: java playframework classloader guice playframework-1.x

我正在开发一个项目,我们将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应用程序文件夹分开。

  1. 有人知道我的分析是否正确吗?
  2. 如果在1.上有“是”,是否有办法配置播放不仅从app文件夹加载类,还从我的src文件夹加载?
  3. 赞赏任何意见。

1 个答案:

答案 0 :(得分:1)

您可以尝试将“src”文件夹附加到Play.javaPath列表,让Play编译并加载您的类。