NoSuchProviderException:带有log4j SMTP appender的smtp

时间:2012-06-11 10:35:48

标签: java log4j jms javamail slf4j

我正在使用log4j在发生异常时发送电子邮件。下面是我的log4j属性文件配置。

log4j.rootLogger=WARN, R, email
log4j.appender.R=org.apache.log4j.ConsoleAppender
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d{HH:mm:ss} %-5p [%c{1}]: %m%n
log4j.appender.email=org.apache.log4j.net.SMTPAppender
log4j.appender.email.BufferSize=10
log4j.appender.email.SMTPHost=myhost.com
log4j.appender.email.From=abc@some.com
log4j.appender.email.To=abc@some.com
log4j.appender.email.Subject=Error
log4j.appender.email.layout=org.apache.log4j.PatternLayout

我是maven项目我已经为mail.jar,activation.jar和smtp.jar添加了依赖项。但是在应用程序服务器启动本身,我得到以下错误:

[ERROR] log4j:ERROR Error occured while sending e-mail notification.
[ERROR] javax.mail.NoSuchProviderException: smtp
[ERROR]     at javax.mail.Session.getService(Session.java:782)
[ERROR]     at javax.mail.Session.getTransport(Session.java:708)
[ERROR]     at javax.mail.Session.getTransport(Session.java:651)
[ERROR]     at javax.mail.Session.getTransport(Session.java:631)
[ERROR]     at javax.mail.Session.getTransport(Session.java:686)
[ERROR]     at javax.mail.Transport.send0(Transport.java:166)

我在这里错过任何东西吗?错误的根本原因是什么?是因为不正确的SMTP主机名?或者是因为任何缺失/冲突的依赖关系?

3 个答案:

答案 0 :(得分:1)

您不需要smtp.jar和mail.jar - smtp.jar中的所有内容也在mail.jar中。摆脱smtp.jar,虽然我怀疑这会解决你的问题。

另外,请确保您的类路径中没有任何其他带有JavaMail类的jar文件,例如javaee.jar或j2ee.jar。

这很可能是某种类路径问题。 JavaMail使用类加载器来查找配置提供程序的配置文件,例如“smtp”。如果类加载器错误地处理资源查找,则可能会出现此问题。

答案 1 :(得分:1)

将JavaMail升级到1.5.3,其中包含fixBug 6668 -skip unusable Store and Transport classes。来自错误报告:

  

在复杂的类加载情况下,有可能存在   JavaMail类的多个副本。已定义商店或运输   一个副本可能会被另一个副本加载,但它不会被使用,因为   他们在不同的ClassLoader中。在这种情况下,JavaMail应该跳过   在不可用的类上尝试从另一个ClassLoader加载该类。

     

例如,如果应用程序包含GlassFish,则会发生这种情况   JavaMail类,应用程序类加载器配置为首选   系统类上的应用程序类,以及app服务器本身的尝试   在应用程序的上下文中运行时使用JavaMail。

您可以从JavaMail reference implementation主页下载最新的快照和正式版。

答案 2 :(得分:0)

您可能希望导出smtp.jar以供您的webapp使用。