Java 11环境下Log4j2 SMTP Appender应使用javax.mail还是jakarta.mail
Java 11 + log4j2 SMTP Appender 适配问题解决方案
问题根因
- log4j 2.12.x是面向Java 8兼容的旧维护分支,SMTP Appender的所有代码默认依赖
javax.mail.*命名空间的API,和jakarta.mail 2.0+使用的jakarta.mail.*命名空间完全不兼容,因此引入jakarta.mail时SMTP Appender找不到所需的类,无法正常初始化发邮件,而控制台、文件Appender不依赖邮件包,所以不受影响。 - 你在Eclipse中看到的
MimeMessageJavadoc显示为jakarta包的情况是IDE类关联错误:只要你的本地项目中存在jakarta.mail的包,IDE会自动把log4j源码中引用的MimeMessage类关联到本地存在的jakarta包下同名类的Javadoc,并非log4j源码本身同时引用了两个命名空间的类。
官方推荐适配方案
方案1:保留log4j 2.12.x版本
直接使用javax.mail:javax.mail-api:1.6.2 + com.sun.mail:javax.mail:1.6.2依赖组合即可,Java 11完全兼容该版本的javax.mail,不存在适配问题。虽然javax.mail 1.x已停止维护,若你没有必须使用jakarta.mail新特性的需求,该方案稳定可用,无需修改现有日志配置。
方案2:使用jakarta.mail 2.0+版本
将log4j全量升级到2.15.0及以上的稳定版本,同时引入对应版本的适配依赖org.apache.logging.log4j:log4j-jakarta-mail,该适配包会将SMTP Appender的实现替换为依赖jakarta.mail.*命名空间的版本,即可正常使用jakarta.mail 2.0+发送邮件。该方案更推荐,高版本log4j还修复了大量历史安全漏洞,安全性和稳定性更优。
注意事项
- 两种依赖方案二选一即可,不要同时引入javax.mail和jakarta.mail的依赖,两者的实现类存在重叠,会触发类加载冲突。
- 升级log4j版本时需保证所有log4j相关依赖的版本完全一致,避免出现版本不兼容问题。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

