java类MyClass不能强制转换为类MyClass(MyClass位于loader org.glassfish的未命名模块中。[…]。WebappClassLoader@1)
为什么在Glassfish/Payara应用服务器的部署阶段有时会出现这种错误? 我可以猜测应用服务器正在尝试使用两个不同类的两个不同类加载器,但是有没有办法防止它这样做
我试图在网上查找一些资料,但什么也没找到
编辑:这在重新部署时发生在同一个应用程序上。它可以通过重启应用服务器来解决,但显然这不是一个解决方案
java.lang.ClassCastException: class com.MyClass cannot be cast to class com.MyClass (com.MyClass is in unnamed module of loader org.glassfish.web.loader.WebappClassLoader@1, com.MyClass is in unnamed module of loader org.glassfish.web.loader.WebappClassLoader@2)
最后一次编辑,在Stephen C.的精彩回应之后。 有什么工具可以解释Payara/GC为什么不销毁旧对象
# 1 楼答案
是的,我认为这就是正在发生的事情。如果相同的
.class
文件由不同的类加载器加载,则生成的运行时类型不同,不能通过强制转换有三种方法可以避免这种情况:
不要在不同的网络应用之间传递或共享这些对象
将定义需要共享的类的JAR移动到web容器的共享库区域。。。因此,它们是由webcontainer的类加载器而不是webapp类加载器加载的
如果类需要由多个webapp类加载器加载(例如,因为它们的名称相同,但实现不同),则可能需要重新构建应用程序,以便这些类实现一个由单个类加载器加载的公共接口。如果你的webapp代码只强制转换到共享界面,你就不会遇到这个问题
如果是这样的话,那么问题似乎在于你的webapp的关闭代码没有做正确的事情。由早期部署的webapp创建的Java对象正在泄漏到后期部署中