前言
之所以要写这篇文章,是因为在平时工作中出现这样一种场景,领导要求用JavaMail开发邮件发送,功能开发测试好以后,发现项目用的jar包是geronimo-javamail_1.4_spec-1.3.jar,而不是Oracle官方的mail.jar,两者不能完全等同。若不清楚这点,就会出现一些不必要的麻烦。
一、关于Apache Geronimo
一个用于企业系统开发的开源项目,你会惊讶于百度竟然没有多少可参考资料,就连百度百科上的介绍也只有几百字,谷歌上倒有不少介绍,英语不好,暂时略过。作为一个J2EE应用服务器,在Eclipse早已提供开发支持,配置截图如下:
【百度百科】
Apache Geronimo 是 Apache 软件基金会的开放源码J2EE服务器,它集成了众多先进技术和设计理念。
这些技术和理念大多源自独立的项目,配置和部署模型也各不相同。
Geronimo能将这些项目和方法的配置及部署完全整合到一个统一、易用的模型中。
另外,好在IBM developerWorks中国上给出完整的介绍和详细的使用教程,下面介绍内容摘自IBM developerWorks中国的Geronimo 入门:(注:IBM developerWorks中国有不少关于它的技术文章,推荐参考学习)
Geronimo 中集成的开放源码项目
|开放源码项目 |说明|
Apache Tomcat 5.5 | 支持 Java Servlet 2.4 和 JavaServer Pages™(JSP) 2.0 的 Web 层应用服务器 |
Jetty | 支持 Java Servlet 2.4 和 JavaServer Pages™(JSP) 2.0 的 Web 层应用服务器 —— 可以替代 Tomcat 服务器 |
ActiveMQ | 开放源码的 Java Message Service(JMS) 1.1 应用程序提供者,支持消息驱动 bean(MDB) |
OpenEJB | 开放源码的 Enterprise JavaBeans(EJB)容器系统和 EJB 服务器,支持 Enterprise JavaBeans 2.1,包括 Container Managed Persistence 2(CMP2)和 EJB Query Language(EJBQL) |
Apache Axis 和 Scout | 一种 Simple Object Access Protocol(SOAP)实现(Axis)和 JSR 93(JAXR)实现(Scout),用于 Web 服务和 Web Services Interoperability Organization(WS-I) Basic Profile 支持 |
Apache Derby | 完全成熟的关系数据库管理系统(RDBMS),支持本机 Java Database Connectivity(JDBC) |
集成在 Geronimo 中的开放源码项目
|开放源码项目 |说明|
Spring Framework | 流行的应用程序框架,用于从轻量级 Inversion of Control(IoC)组件构建应用程序 |
ServiceMix | 开放源码工具集,支持 Java Business Integration(JBI)并且为面向服务体系结构(SOA)实现提供 Enterprise Service Bus(ESB) |
当然以上介绍的内容和我要讲的内容关系不大,仅作知识普及。介绍内容好像没有提到我说的geronimo-javamail_1.4,不过从我的理解角度来讲,geronimo-javamail_1.4是Apache基于Geronimo开发的JavaMail服务组件,还有类似的servlet组件和JTA组件等,这些组件都有单独的jar包,Geronimo官网上我并没找到这些jar包,而是在outofmemory网站的Maven中央仓库找到的。(http://maven.outofmemory.cn/o...)
二、geronimo-javamail_1.4使用说明
1、jar包不全,导致邮件发送异常报错
简单将Apache的geronimo-javamail_1.4_spec-1.3.jar等同Oracle官方的mail.jar,沿用原有代码进行邮件发送测试,出现如下异常错误信息:
javax.mail.NoSuchProviderException: Unable to locate provider for protocol: smtp
at javax.mail.Session.getProvider(Session.java:237)
at javax.mail.Session.getTransport(Session.java:346)
从报错信息来看,是缺少名为smtp的provider,信息很明确,却不知从何排查。我当时的第一反应是,两者的配置方式可能不同,但从网上大部分给出的意见是用回原来的mail.jar包(比如stackoverflow:Unable to locate provider for protocol: smtp),以致于我也开始放弃其他解决方案。但是当我将这种解决方案用在项目中,我开始产生另外一种顾虑,geronimo-javamail_1.4会不会已经在其他功能中使用了?(这个评估不到位,就可能导致不必要的风险),再者项目用的是Maven依赖库,进行jar删除操作也是一件麻烦的事,而仅加多mail.jar又会引发其他问题(参看JavaMail邮件发送不成功的那些坑人情况及分析说明的“4、jar包重叠存在javax.mail.*”)。
于是,我又尝试搜索可能的其他解决方案,不过这次从我尝试翻墙试试谷歌,果然无意间看到了一个关于Geronimo JavaMail 1.4的官方指导说法,内容如下:(链接:http://geronimo.apache.org/ma...)
原来是因为缺少geronimo-javamail_1.4_provider这个配套jar包,可是在stackoverflow这个专业的问答社区网站也没见人提及,这也足以说明Geronimo JavaMail 1.4确实还应用得不是很广泛。
2、jar包版本配套不兼容,导致邮件内容错误
虽然问题是找到,但也很快出现的另外一个问题,项目使用的是geronimo-javamail_1.4_spec-1.3.jar,geronimo-javamail_1.4_provider该用哪个版本呢?我想邮件发送是基本常用功能,应该不会改动太大,代码应该是兼容的。由于没有找到官方给的配套版本说明,我就先从outofmemory网站的Maven中央仓库下载了最新的provider-1.8.3.jar。测试发现发送的邮件无标题且内容乱码,一下子抛出了一个jar包配套兼容性的问题。
抱着试试看的想法,我又下载了provider-1.3.jar和provider-1.4.jar,结果测试都正常。这下问题来了,到底选1.3还是1.4呢?把问题和风险上报领导,领导也是举棋不定了...既然官方说明是javamail_1.4_spec-1.6.jar配套javamail_1.4_provider-1.7.jar,那javamail_1.4_spec-1.3.jar就参考配套javamail_1.4_provider-1.4.jar吧,也只能这么参考选择了...(其实也是一个不太科学的选择方法)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。