最近开发邮件发送的项目功能时,发现这个java.lang.NoClassDefFoundError: com/sun/mail/util/SharedByteArrayInputStream。。。。。这样的错误。搜索了一下项目中是有这样的一个class文件的。但路径确实javax.mail.util下的SharedByteArrayInputStream类。
所以就很好奇到底什么原因造成这样的导包错误呢?
于是就找上了我最好的老师,上网搜索了一下发现这样的一篇文章讲的很对,我也亲自查找了一下,确实是这样的一个原因造成的。文章地址点我 文章内容如下:
最近碰到jar包冲突,抛出的异常:java.lang.NoClassDefFoundError: com/sun/mail/util/SharedByteArrayInputStream,导致发邮件发布出去。在线下无法重现,而线上确大部分情况都能重现。
在http://www.findjar.com搜了一下发现含有这个类的有mail-1.3.3.jar,而我工程里面使用的mail-1.4.5.jar。这样一来似乎把mail包的版本降低到1.3.3就行了。
but倔强的我不想降版本,所以不得不找出到底是哪里使用到了com.sum.mail.util.SharedByteArrayInputStream类,在网上百度了一番,发现j2ee.jar有嫌疑,我用的是j2ee-1.4.jar和mail-1.4.5.jar,把这个jar包使用jd反编译后看到了原因,j2ee-1.4.jar和mail-1.4.5.jar中都使用了javax.mail.internet.MimeMessage类,而j2ee-1.4.jar中的MimeMessage中import了com.sun.mail.util.SharedByteArrayInputStream类,mail-1.4.5.jar中的MimeMessage中import了javax.mail.util.SharedByteArrayInputStream类。在线下很可能mail-1.4.5.jar包中的MimeMessage类被优先load到jvm中,所以使用了javax.mail.util.SharedByteArrayInputStream类;而线上则很可能j2ee-1.4.jar中的MimeMessage类被优先load到jvm中,而com.sun.mail.util.SharedByteArrayInputStream类在整个web工程中确实不存在,所以出现了如题的异常。
这样一来解决的办法就是得升级j2ee.jar包,经查j2ee-5.jar使用MimeMessage类与mail-1.4.5.jar中的完全一样,都import的是javax.mail.util.SharedByteArrayInputStream类。这样把升级j2ee包到版本5就行了。
总结一下:j2ee-1.4.jar与mail-1.3.3jar匹配,j2ee-5.jar与mail-1.4.5.jar匹配即可避免jar包冲突。
嗯嗯,最重要的就是j2ee-1.4.jar与mail-1.3.3jar匹配,j2ee-5.jar与mail-1.4.5.jar匹配即可避免jar包冲突。
确实是jar包不匹配造成的,而却终却在类加载中顺序不一样造成的。但当时又不想随意的升级或降级jar包。
怎么办呢?
1、本地的工作环境中可以将jar包的顺序调整,build中up或down,将想要用的放在上边即可。
2、如果在相同的目录下也可以按1中操作,但是实际项目是在weblogic上运行的,里边的加载顺序又是怎么的还有待验证。(有人说相同目录下可以重命名jar包来实现排在前面加载,应该也是可行的)