前言

  之所以要写这篇文章,是因为在平时工作中出现这样一种场景,领导要求用JavaMail开发邮件发送,功能开发测试好以后,发现项目用的jar包是geronimo-javamail_1.4_spec-1.3.jar,而不是Oracle官方的mail.jar,两者不能完全等同。若不清楚这点,就会出现一些不必要的麻烦。

一、关于Apache Geronimo

  一个用于企业系统开发的开源项目,你会惊讶于百度竟然没有多少可参考资料,就连百度百科上的介绍也只有几百字,谷歌上倒有不少介绍,英语不好,暂时略过。作为一个J2EE应用服务器,在Eclipse早已提供开发支持,配置截图如下:

clipboard.png

【百度百科】

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...

clipboard.png

  原来是因为缺少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吧,也只能这么参考选择了...(其实也是一个不太科学的选择方法)


JackFe
180 声望3 粉丝

Java开发者