Spring Boot集成AWS SES时出现javax.mail类找不到异常
Spring Boot集成AWS SES邮件服务时遇
javax.mail.MessagingException缺失问题 问题背景
尝试在Spring Boot应用中集成AWS SES邮件服务,已添加以下Maven依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-aws</artifactId> <version>2.1.0.RELEASE</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-ses</artifactId> <version>1.11.505</version> </dependency> <dependency> <groupId>javax</groupId> <artifactId>javaee-web-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency>
运行应用时触发如下错误:
Caused by: java.lang.NoClassDefFoundError: javax/mail/MessagingException at com.xr.crosscheck.config.SESConfig.javaMailSender(SESConfig.java:38) ~[classes/:na] at com.xr.crosscheck.config.SESConfig$$SpringCGLIB$$0.CGLIB$javaMailSender$1(<generated>) ~[classes/:na] at com.xr.crosscheck.config.SESConfig$$SpringCGLIB$$FastClass$$1.invoke(<generated>) ~[classes/:na] at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[spring-core-6.1.2.jar:6.1.2] at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-6.1.2.jar:6.1.2] at com.xr.crosscheck.config.SESConfig$$SpringCGLIB$$0.javaMailSender(<generated>) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:140) ~[spring-beans-6.1.2.jar:6.1.2] ... 67 common frames omitted Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) ~[na:na] at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) ~[na:na] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) ~[na:na] ... 78 common frames omitted
配置类代码如下:
@Configuration public class SESConfig { @Value("${cloud.aws.credentials.access-key}") private String accessKey; @Value("${cloud.aws.credentials.secret-key}") private String secretKey; @Value("${cloud.aws.region.static}") private String region; @Bean public AmazonSimpleEmailService amazonSimpleEmailService() { BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); return AmazonSimpleEmailServiceClientBuilder.standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withRegion(Regions.EU_CENTRAL_1) .build(); } @Bean public JavaMailSender javaMailSender(AmazonSimpleEmailService amazonSimpleEmailService) { return new SimpleEmailServiceJavaMailSender(amazonSimpleEmailService); } }
问题原因与解决方案
核心原因
javax.mail.MessagingException类缺失:javaee-web-api依赖的scope是provided,不会被打包到应用中;且Spring Boot 3.x(从spring-core-6.1.2版本判断)基于Jakarta EE,原javax包已替换为jakarta包。- 依赖版本不兼容:旧版
spring-cloud-starter-aws(2.1.0.RELEASE)和AWS SDK v1(1.11.x)与Spring Boot 3.x适配性差。
解决步骤
步骤1:替换邮件依赖
移除javaee-web-api依赖,添加Jakarta Mail依赖:<dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> <version>2.0.1</version> </dependency>步骤2:替换AWS相关依赖
移除原有的spring-cloud-starter-aws和aws-java-sdk-ses,添加适配Spring Boot 3.x的AWS SDK v2依赖:<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>ses</artifactId> <version>2.25.0</version> </dependency> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-aws-starter-ses</artifactId> <version>3.0.0</version> </dependency>步骤3:调整配置类适配AWS SDK v2
@Configuration public class SESConfig { @Value("${cloud.aws.credentials.access-key}") private String accessKey; @Value("${cloud.aws.credentials.secret-key}") private String secretKey; @Value("${cloud.aws.region.static}") private String region; @Bean public SesClient sesClient() { AwsBasicCredentials credentials = AwsBasicCredentials.create(accessKey, secretKey); return SesClient.builder() .credentialsProvider(StaticCredentialsProvider.create(credentials)) .region(Region.of(region)) .build(); } @Bean public JavaMailSender javaMailSender(SesClient sesClient) { return new SimpleEmailServiceJavaMailSender(sesClient); } }步骤4:确认配置文件
确保application.properties或application.yml中的AWS配置正确:cloud.aws.credentials.access-key=你的AWS访问密钥 cloud.aws.credentials.secret-key=你的AWS私有密钥 cloud.aws.region.static=eu-central-1
内容的提问来源于stack exchange,提问作者SERKAN AYDOGDU
相关产品推荐
相关产品推荐

