Pac4j + Play框架热类重载问题

问题描述 投票:0回答:1

我们使用 Play 框架 (v2.8.16) 和 Pac4j (v10.0.2) 作为在 OpenJDK 12 上运行的安全框架。我们的应用程序是一个 Java 应用程序,我们使用 Play 的多模块设置。 在 Play 的开发模式中,有一个热代码重新加载功能,该功能似乎会在扩展 Pac4j 类型的自定义类上出现问题。 这种情况在某些开发人员身上经常发生,而在其他开发人员身上则每隔几天发生一次(相同的 JDK 和库)。从 IDE (IntelliJ) 或命令行 SBT 运行是相同的。

因此给出一个自定义类型:

public class CustomJwtProfile extends org.pac4j.jwt.profile.JwtProfile

热代码重新加载失败并显示:

play.api.PlayException: Execution exception[[ClassCastException: class my.package.CustomJwtProfile cannot be cast to class class my.package.CustomJwtProfile (class my.package.CustomJwtProfile is in unnamed module of loader 
play.runsupport.DelegatedResourcesClassLoader @2a1321ec; my.package.CustomJwtProfile is in unnamed module of loader 
play.runsupport.DelegatedResourcesClassLoader @47424930)]]

我怀疑 Play 的代码重新加载是通过一种相当粗粒度的机制来工作的,它只是在不同的类加载器中重新加载整个应用程序(我们在代码重新加载日志输出中看到它再次初始化/引导 Play 应用程序)。在我看来,上述错误似乎是运行时类型不匹配,因此相同的“类文件类型”存在于不同的类加载器中 - 因此在 JVM 现实中,它们形成了两种不同的运行时类型,这导致了

ClassCastExcpeption
。 也许 Pac4j 代码没有与应用程序代码一起正确换出,并且旧运行时类型的一些对象仍然存在?

我们目前只是停止 Play 进程并再次通过 SBT 启动它..这会大大减慢受影响严重的开发人员的速度,并有效地使热代码重新加载变得毫无用处。

感谢您的任何想法...

java playframework sbt pac4j playframework-2.8
1个回答
0
投票

想法(你想要全部🤣你认为这是你的计划吗?尝试重新启动计算机,通常它已经运行了数周。 my.package.CustomJwtProfile 位于加载程序的未命名模块中。 这看起来很有趣,似乎 CustomJwtProfile 不存在或位置错误。祝你好运! 附:这是什么:class 类my.package.CustomJwtProfile。

© www.soinside.com 2019 - 2024. All rights reserved.