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

标签 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/{ Play Controller 和模型等} project/src/{我的项目特定类实现业务逻辑}

启动 Play 应用程序时,我还会在“src”文件夹中启 Action 业(来自 Play 托管应用程序类的外部)。似乎发生的情况是,这些作业访问的模型和其他类此时使用默认类加载器加载,当我尝试从 Play 应用程序类( View 等)使用这些类时,我收到此错误告诉我使用的类是使用不同的类加载器创建的,因此具有不同的签名。

因此,总而言之,默认类加载器和 Play 类加载器都会加载相同的类,并且根据我调用它们的方式,我会收到错误匹配的错误。

我已经能够通过简单地将所有源文件移动到项目/应用程序/源文件夹中来解决这个问题,但我想将 src 文件夹与 Play 应用程序文件夹分开。

  1. 有人知道我的分析是否正确吗?
  2. 如果 1. 为"is",是否可以将 play 配置为不仅从应用程序文件夹加载类,还从我的 src 文件夹加载类?

欢迎任何意见。

最佳答案

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

关于java - 与默认类加载器和 PlayFramework 自定义类加载器冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12153248/

相关文章:

java - 从带有线程的方法返回

java - 使用 log4j 生成日志文件的问题

java - Play!/Morphia - 以字符串形式返回 MongoID(在 json 内)/blobFieldsTracker Field

java - 在 Spring Boot 中从类路径加载嵌套资源

java - Spark MapWithState 执行模型

java - 如何在不创建实际对象的情况下访问类的已运行实例

java - 使用 'sbt new playframework/play-java-seed.g8' 创建新项目 java 项目时无法正常工作并出现错误

jar - 按路径从 Jar 中获取文件

java - 从 JAR 中读取文件不适用于 Windows

Java HashMap 先按值再按键排序