类myclass不能强制转换为类myclass(myclass位于loader org.glassfish的未命名模块中[…]webappclassloader@1)

ewm0tg9j  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(370)

为什么在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)

最后一次编辑,在斯蒂芬c。有什么工具可以解释payara/gc为什么不销毁旧对象?

wztqucjr

wztqucjr1#

我可以猜测应用程序服务器正在尝试使用两个不同类的两个不同类加载器,但是有没有办法阻止它这样做呢?
是的,这就是我认为正在发生的事情。如果相同 .class 文件由不同的类加载器加载,生成的运行时类型不同,不能通过强制转换。
有三种方法可以避免这种情况:
不要在不同的webapp之间传递或共享这些对象。
将定义需要共享的类的jar移动到web容器的共享库区域中。。。因此它们是由webcontainer的类加载器而不是webapp类加载器加载的。
如果类需要由多个webapp类加载器加载(例如,因为类具有相同的名称但不同的实现),则可能需要重新构建应用程序,以便类实现由单个类加载器加载的公共接口。如果您的webapp代码仅强制转换到共享界面,则不会遇到此问题。
如果web应用程序是相同的呢(所以当应用程序重新部署同一个应用程序时)
如果是这样的话,那么听起来问题是你的webapp的关闭代码没有做正确的事情。早期部署的webapp创建的java对象正在泄漏到后期部署中。
检查是否有东西没有缓存应用程序对象。
检查应用程序对象是否隐藏在会话状态或线程局部变量中,或者类似的情况。

相关问题