由于最近业务需求,需要添加一个预警发送邮件功能。本地采用Main方法跑一切正常,推到测试环境则会出现以下报错信息:
java.lang.UnsupportedOperationException: Method not yet implemented
at javax.mail.internet.MimeMessage.<init>(MimeMessage.java:89)
at com.xx.xx.util.mail.MailSender.createMsg(MailSender.java:86)
at com.xx.xx.util.mail.MailSender.send(MailSender.java:193)
at com.xx.xx.util.MailUtils.sendMail(MailUtils.java:64)
at com.xx.xx.util.MailUtils.sendSyncTaskStopMail(MailUtils.java:31)
at com.xx.xx.task.SendMailTask.run(SendMailTask.java:35)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
然后就查了一下,定位问题是maven中的 geronimo-spec-javamail jar包的问题,继续查了一下,在项目中运行 mvn dependency:tree ,可以看到 maven 生成的依赖树。如下片段:
[INFO] +- com.cloudhopper.proxool:proxool:jar:0.9.1:compile
[INFO] | \- avalon-framework:avalon-framework-api:jar:4.3:compile
[INFO] | \- avalon-logkit:avalon-logkit:jar:2.1:compile
[INFO] | +- geronimo-spec:geronimo-spec-javamail:jar:1.3.1-rc3:compile
[INFO] | \- geronimo-spec:geronimo-spec-jms:jar:1.1-rc4:compile
博主出问题的是因为 MineMessage类所依赖的包有多个,
邮件mail-1.6.2.jar与数据库连接池包proxool-0.9.1.jar都有MineMessage类照成报冲突,导致Session创建失败
解决方案:需要在 pom.xml 中引入 proxool 的引用中加上 excluded 标签,如下:
<dependency>
<groupId>com.cloudhopper.proxool</groupId>
<artifactId>proxool</artifactId>
<version>0.9.1</version>
<!-- 这个就是我们要排除依赖包,解决jar包冲突 -->
<exclusions>
<exclusion>
<groupId>geronimo-spec</groupId>
<artifactId>geronimo-spec-javamail</artifactId>
</exclusion>
<exclusion>
<groupId>geronimo-spec</groupId>
<artifactId>geronimo-spec-jms</artifactId>
</exclusion>
</exclusions>
</dependency>
按照上面进行改之后,在对应测试环境发送邮件一切都OK,^_^。