Java 为什么强制转换可以在本地工作而不能在服务器上工作?

Java 为什么强制转换可以在本地工作而不能在服务器上工作?,java,tomcat,imap,jakarta-mail,Java,Tomcat,Imap,Jakarta Mail,这是一个有点特殊的问题,但我使用javamail连接到IMAP服务器以获取一些消息,当我在命令行中本地运行我的程序时,它运行得很好,但当它上载到tomcat以运行时,我得到了这个强制转换错误: java.lang.ClassCastException: javax.mail.internet.MimeMultipart cannot be cast to javax.mail.internet.MimeMultipart 代码行是: MimeMultipart mp; mp = ((MimeM

这是一个有点特殊的问题,但我使用javamail连接到IMAP服务器以获取一些消息,当我在命令行中本地运行我的程序时,它运行得很好,但当它上载到tomcat以运行时,我得到了这个强制转换错误:

java.lang.ClassCastException: javax.mail.internet.MimeMultipart cannot be cast to javax.mail.internet.MimeMultipart
代码行是:

MimeMultipart mp;
mp = ((MimeMultipart)message.getContent());
消息定义为:

Message message = null;
message = folder.getMessageByUID(14299);

我不知道为什么我可以在本地运行时强制转换它,但是它在服务器上崩溃了。我两次都在使用同一条消息,它是硬编码的,所以我不可能提取一条不是mimultipart的消息。有什么想法吗?如果你还需要我发布什么,我会的,尽管问。谢谢

这可能是一个类加载器问题,有关几种可能的解决方案,请参阅:

根据当前问题状态下提供给我们的信息,得出解决方案的最佳方法是验证加载MiMemMultiPart的类加载器:

ClassLoader myClassLoader = new MyClass().getClass().getClassLoader();
然而,沿着这条路走下去可能需要比预期更长的时间


这很可能是Tomcat安装中的局部错误。如果您能够在另一台服务器(如GlassFish)上尝试,或者可以在新安装的Tomcat上尝试,您可能会发现问题已经解决。您已经通过命令行确认程序正常。

以下类型的错误消息:

java.lang.ClassCastException: CLASS cannot be cast to CLASS
通常表示类加载器问题。您正在尝试从一个类加载器转换到驻留在另一个类加载器中的实例

我猜javamail jar在您的webapp的/WEB-INF/lib文件夹中。在这种情况下,如果它们也在tomcat的lib文件夹中,那么您将得到确切的消息


解决此问题的一种方法是从tomcat安装中删除javamail LIB并将其保留在webapp中,或者不将其包含在war中。

客户端和服务器是否使用不同的JVM?是的,客户端和服务器使用不同的JVM。这似乎是一个类加载器问题。当它崩溃时,这就是我得到的全部。。。java.lang.ClassCastException:javax.mail.internet.MimeMultipart无法在com.wingdom.connect.IMAP_connect.map(IMAP_connect.java:72)上转换为javax.mail.internet.MimeMultipart。。。这听起来像是发生了什么,让我玩一下,看看我能得到什么。