近日在用 JavaMail 编写发送 E-mail 的应用,在一段十分普通的 Java 代码中出现了如下的一段异常:
DEBUG: setDebug: JavaMail version 1.3.2
Exception in thread "Main Thread" java.lang.NoClassDefFoundError: com/sun/mail/util/SharedByteArrayInputStream
at xxx.test.SendMail.main(SendMail.java:33)
代码是网络上泛滥了的 JavaMail 发送邮件的代码,出错部分的代码大致如下:
//
Define message
MimeMessage message
=
new
MimeMessage(session);
认真检查所有代码之后没有发现任何的异常或者错误,然后检查 mail.jar 包中的 class,发现该类的确不存在,“死程序不说谎”。然后在分析一下 Exception,发现 “JavaMail version 1.3.2”,哎,怎么是1.3.2 version,我明明导入到 lib 中的是1.4 version。这是那里出现了问题。
看来应该是 jre 环境加载 jar 包的时候出现了问题,可能在加载我的新版本的 mail.jar 之前已经加载了比较旧的版本。认真地检查了一下当前的环境,可是没有发现存在这个mail.jar包。由于 IDE 环境是 Workshop,所以怀疑是bea搞了一些 JavaMail 相关的东西在里面,经过认真的查找分析,原来在 weblogic 的 api.jar 包中竟然存在一个 mail 目录,其中存放的就是 JavaMail 的所有类。这里是不是问题的所在,随即检查了一遍所有的 class,发现目录结构和1.4 version 中的完全一样。由于 api.jar 包是自动导入到当前的 project 中的,所以当时没有直接删除它,而是在 Idea 上新建 project,直接测试发现确有出现上面的那个异常,看来应该是环境的问题。
至于如何在 workshop 中使其可以使用,还需要一些时间去研究它,但是它至少说明了一个问题,那就是:我开发所使用的 JavaMail version 应该高于jre(jdk)环境中的某个 jar。现在由于重点不在如何利用 JavaMail 发邮件,而是测试 linux 下的 sendmail 是否可用,所以暂时将这个问题 pending 在这里,以后一定要解决掉。
后来 google 到 sun 论坛上一个针对该问题的回复:
You wrote an application that uses this JavaMail 1.4 class but you're
running it in an environment that is finding an older version of JavaMail.
DEBUG: setDebug: JavaMail version 1.3.2
Exception in thread "Main Thread" java.lang.NoClassDefFoundError: com/sun/mail/util/SharedByteArrayInputStream
at xxx.test.SendMail.main(SendMail.java:33)
代码是网络上泛滥了的 JavaMail 发送邮件的代码,出错部分的代码大致如下:
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
认真检查所有代码之后没有发现任何的异常或者错误,然后检查 mail.jar 包中的 class,发现该类的确不存在,“死程序不说谎”。然后在分析一下 Exception,发现 “JavaMail version 1.3.2”,哎,怎么是1.3.2 version,我明明导入到 lib 中的是1.4 version。这是那里出现了问题。
看来应该是 jre 环境加载 jar 包的时候出现了问题,可能在加载我的新版本的 mail.jar 之前已经加载了比较旧的版本。认真地检查了一下当前的环境,可是没有发现存在这个mail.jar包。由于 IDE 环境是 Workshop,所以怀疑是bea搞了一些 JavaMail 相关的东西在里面,经过认真的查找分析,原来在 weblogic 的 api.jar 包中竟然存在一个 mail 目录,其中存放的就是 JavaMail 的所有类。这里是不是问题的所在,随即检查了一遍所有的 class,发现目录结构和1.4 version 中的完全一样。由于 api.jar 包是自动导入到当前的 project 中的,所以当时没有直接删除它,而是在 Idea 上新建 project,直接测试发现确有出现上面的那个异常,看来应该是环境的问题。
至于如何在 workshop 中使其可以使用,还需要一些时间去研究它,但是它至少说明了一个问题,那就是:我开发所使用的 JavaMail version 应该高于jre(jdk)环境中的某个 jar。现在由于重点不在如何利用 JavaMail 发邮件,而是测试 linux 下的 sendmail 是否可用,所以暂时将这个问题 pending 在这里,以后一定要解决掉。
后来 google 到 sun 论坛上一个针对该问题的回复:
You wrote an application that uses this JavaMail 1.4 class but you're
running it in an environment that is finding an older version of JavaMail.