迁移至Jakarta Mail遇StreamProvider找不到异常求助(非Spring Boot)
解决Jakarta Mail发送邮件时的
Not provider of jakarta.mail.util.StreamProvider异常 问题根源
这个异常是因为运行时缺少jakarta.mail.util.StreamProvider的具体实现,或是依赖版本不匹配、冲突导致的。你当前的依赖仅引入了API包,缺少对应实现类库的支持。
具体解决步骤
调整依赖结构,补充实现包
- 移除单独的
jakarta.mail-2.1.3.jar,Angus Mail是Jakarta Mail的官方实现,已包含API和实现逻辑,同时引入两者会导致冲突。 - 添加
angus-mail-activation-2.0.3.jar(与你使用的Angus Mail版本保持一致),该包提供Jakarta Activation的实现,同时包含StreamProvider的具体实现类。
调整后的classpath依赖如下:
<classpathentry kind="lib" path="/home/astump/src/codex/Java/asWeb/web/WEB-INF/lib/angus-mail-2.0.3.jar"/> <classpathentry kind="lib" path="/home/astump/src/codex/Java/asWeb/web/WEB-INF/lib/angus-mail-activation-2.0.3.jar"/> <classpathentry kind="lib" path="/home/astump/src/codex/Java/asWeb/web/WEB-INF/lib/jakarta.jakartaee-api-10.0.0.jar"/>- 移除单独的
清理冲突依赖
- 检查项目中是否存在旧的javax.mail相关jar包(如mail.jar、javax.mail-api.jar),若有必须删除,避免与Jakarta Mail的包发生类路径冲突。
- 确保没有其他版本的Jakarta Mail/Activation API包混入项目,
jakarta.jakartaee-api-10.0.0.jar作为规范API包,与Angus Mail实现兼容,无需额外添加其他API包。
保持导入包的正确性
继续使用jakarta.mail.*和jakarta.activation.*的导入路径,不要切换到com.eclipse.angus.mail.*。Angus Mail是Jakarta Mail的底层实现,业务代码应基于Jakarta规范API编写,直接引用实现类会增加代码耦合性。验证Gmail发送配置
确保邮件发送配置符合Gmail要求:- SMTP服务器使用
smtp.gmail.com,端口选择587(TLS)或465(SSL) - 若账户开启两步验证,需使用应用专用密码登录,而非普通账户密码
- 若未开启两步验证,需允许账户访问低安全性应用(推荐使用应用专用密码更安全)
- SMTP服务器使用
验证操作
修改依赖后,清理项目编译目录(如target/classes),重新编译部署到Tomcat 10,再测试邮件发送功能。
内容的提问来源于stack exchange,提问作者user3260912
相关产品推荐
相关产品推荐

