Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类MyClass不能强制转换为类MyClass(MyClass位于loader org.glassfish的未命名模块中。[…]。WebappClassLoader@1)_Java_Classloader_Profiler_Payara_Glassfish 5 - Fatal编程技术网

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

Java 类MyClass不能强制转换为类MyClass(MyClass位于loader org.glassfish的未命名模块中。[…]。WebappClassLoader@1),java,classloader,profiler,payara,glassfish-5,Java,Classloader,Profiler,Payara,Glassfish 5,为什么在Glassfish/Payara应用服务器的部署阶段有时会出现此错误? 我可以猜测应用程序服务器正在尝试使用两个不同类的两个不同类加载器,但是有没有办法阻止它这样做 我试图在网上查找一些资料,但什么也没找到 编辑:这在重新部署时发生在同一应用程序上。它可以通过重启应用服务器来解决,但显然这不是一个解决方案 java.lang.ClassCastException: class com.MyClass cannot be cast to class com.MyClass (com.MyC

为什么在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为什么不销毁旧对象

我可以猜测应用程序服务器正在尝试使用两个不同类的两个不同类加载器,但是有没有办法阻止它这样做

是的,我认为这就是正在发生的事情。如果相同的
.class
文件由不同的类加载器加载,则生成的运行时类型不同,不能通过强制转换

有三种方法可以避免这种情况:

  • 不要在不同的Web应用程序之间传递或共享这些对象

  • 将定义需要共享的类的JAR移动到web容器的共享库区域。。。因此,它们是由webcontainer的类加载器而不是webapp类加载器加载的

  • 如果类需要由多个webapp类加载器加载(例如,因为类具有相同的名称但不同的实现),则可能需要重新构建应用程序,以便类实现由单个类加载器加载的公共接口。如果您的webapp代码仅强制转换到共享界面,则不会遇到此问题



  • 如果web应用程序是相同的呢?(因此,当应用程序重新部署同一应用程序时)

    如果是这样的话,那么问题似乎在于你的webapp的关闭代码没有做正确的事情。由早期部署的webapp创建的Java对象正在泄漏到后期部署中

    • 检查是否有东西未缓存应用程序对象
    • 检查应用程序对象是否未隐藏在会话状态或线程局部变量中,或类似情况

    如果web应用程序相同怎么办?(所以当应用程序重新部署同一个应用程序时)太好了。。。无法理解的工具(payara?垃圾桶?)为什么决定保留旧的?剖析器@Stephen C1)重新部署同一应用程序时也会出现这些问题。每次重新部署都会创建一个新的类加载器。2) 我不明白你在问什么。老实说,我不知道调查和解决这类问题的正确工具,如何检查“应用程序对象是否未隐藏在会话状态或线程局部变量中”?嗯。。。您可以编写一些代码来查看隐藏在会话状态或线程局部变量中的对象。或者,您可以编写一些代码,在重新部署时清除所有会话状态或线程局部变量。或者,您可以手动审核代码,查看隐藏在那里的对象的种类。