Spring集成Amazon SES时出现ClassNotFoundException异常求助
问题:Spring Boot集成Amazon SES时出现ClassNotFoundException错误
我按照教程搭建Spring Boot集成Amazon SES邮件服务,构建时持续抛出java.lang.ClassNotFoundException: io.awspring.cloud.jdbc.config.annotation.AmazonRdsInstanceConfiguration异常,以下是我的代码配置及报错信息,求解决。
配置文件(AmazonSESConfig.java)
import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.simpleemail.AmazonSimpleEmailService; import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder; import io.awspring.cloud.ses.SimpleEmailServiceMailSender; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.mail.MailSender; @Configuration public class AmazonSESConfig { @Value("${amazon.aws.accessKey}") private String accessKey; @Value("${amazon.aws.secretKey}") private String secretKey; @Value("${amazon.aws.region}") private String region; @Bean public AmazonSimpleEmailService amazonSimpleEmailService() { BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); return AmazonSimpleEmailServiceClientBuilder .standard() .withCredentials(new AWSStaticCredentialsProvider(credentials)) .withRegion(region) .build(); } @Bean public MailSender mailSender(AmazonSimpleEmailService amazonSimpleEmailService) { return new SimpleEmailServiceMailSender(amazonSimpleEmailService); } }
属性文件(application.properties)
amazon.aws.accessKey=ACCESS_KEY amazon.aws.secretKey=SECRET_KEY amazon.aws.region=ca-central-1
服务类(CorrespondenceService.java)
@Service public class CorrespondenceService { @Autowired private MailSender mailSender; public void sendMail(){ SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setFrom("testFromEmail@test.com"); simpleMailMessage.setTo("testToEmail@test.com"); simpleMailMessage.setSubject("Test"); simpleMailMessage.setText("This email is a test"); mailSender.send(simpleMailMessage); } }
主类(EmailApplication.java)
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class EmailApplication { public static void main(String[] args) { SpringApplication.run(EmailApplication.class, args); } }
报错堆栈
java.lang.IllegalArgumentException: Could not find class [io.awspring.cloud.jdbc.config.annotation.AmazonRdsInstanceConfiguration] at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:334) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.core.annotation.TypeMappedAnnotation.adapt(TypeMappedAnnotation.java:446) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.core.annotation.TypeMappedAnnotation.getValue(TypeMappedAnnotation.java:369) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.core.annotation.TypeMappedAnnotation.asMap(TypeMappedAnnotation.java:284) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.core.annotation.AbstractMergedAnnotation.asAnnotationAttributes(AbstractMergedAnnotation.java:193) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.core.type.AnnotatedTypeMetadata.getAnnotationAttributes(AnnotatedTypeMetadata.java:106) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.core.type.AnnotatedTypeMetadata.getAnnotationAttributes(AnnotatedTypeMetadata.java:81) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.context.annotation.AnnotationConfigUtils.attributesFor(AnnotationConfigUtils.java:285) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.AnnotationBeanNameGenerator.determineBeanNameFromAnnotation(AnnotationBeanNameGenerator.java:103) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.AnnotationBeanNameGenerator.generateBeanName(AnnotationBeanNameGenerator.java:82) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.registerBeanDefinitionForImportedConfigurationClass(ConfigurationClassBeanDefinitionReader.java:169) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:150) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:129) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:343) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:247) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:311) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:112) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:746) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:564) ~[spring-context-5.3.19.jar:5.3.19] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.6.7.jar:2.6.7] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:740) ~[spring-boot-2.6.7.jar:2.6.7] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:415) ~[spring-boot-2.6.7.jar:2.6.7] at org.springframework.boot.SpringApplication.run(SpringApplication.java:303) ~[spring-boot-2.6.7.jar:2.6.7] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1312) ~[spring-boot-2.6.7.jar:2.6.7] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) ~[spring-boot-2.6.7.jar:2.6.7] at *MY APPLICATION PATH*(MyApplication.java:10) ~[classes/:na] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) ~[spring-boot-devtools-2.6.7.jar:2.6.7] Caused by: java.lang.ClassNotFoundException: io.awspring.cloud.jdbc.config.annotation.AmazonRdsInstanceConfiguration 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:521) ~[na:na] at java.base/java.lang.Class.forName0(Native Method) ~[na:na] at java.base/java.lang.Class.forName(Class.java:495) ~[na:na] at java.base/java.lang.Class.forName(Class.java:474) ~[na:na] at org.springframework.boot.devtools.restart.classloader.RestartClassLoader.loadClass(RestartClassLoader.java:145) ~[spring-boot-devtools-2.6.7.jar:2.6.7] at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ~[na:na] at java.base/java.lang.Class.forName0(Native Method) ~[na:na] at java.base/java.lang.Class.forName(Class.java:495) ~[na:na] at java.base/java.lang.Class.forName(Class.java:474) ~[na:na] at org.springframework.util.ClassUtils.forName(ClassUtils.java:284) ~[spring-core-5.3.19.jar:5.3.19] at org.springframework.util.ClassUtils.resolveClassName(ClassUtils.java:324) ~[spring-core-5.3.19.jar:5.3.19] ... 28 common frames omitted
解决方案
这个错误源于Spring尝试加载RDS相关配置类,但你的项目只用到SES,缺少对应依赖或依赖版本不兼容,可通过以下方式解决:
1. 排除RDS自动配置
修改主类的@SpringBootApplication注解,排除不必要的RDS自动配置类,阻止Spring加载不存在的类:
@SpringBootApplication(exclude = {AmazonRdsInstanceAutoConfiguration.class})
2. 替换为专用SES依赖
AWS Spring Cloud已迁移到awspring组织,使用最新的专用SES依赖,避免冗余的RDS模块:
- Maven:
<dependency> <groupId>io.awspring.cloud</groupId> <artifactId>awspring-cloud-starter-ses</artifactId> <version>3.0.0</version> <!-- 版本需匹配Spring Boot,例如2.6.x对应3.0.x --> </dependency>
- Gradle:
implementation 'io.awspring.cloud:awspring-cloud-starter-ses:3.0.0'
同时移除旧的spring-cloud-starter-aws依赖,避免版本冲突。
3. 排除传递依赖中的RDS模块
如果必须保留旧版spring-cloud-starter-aws,手动排除RDS相关传递依赖:
Maven示例:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-aws</artifactId> <version>2.2.6.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-aws-jdbc</artifactId> </exclusion> </exclusions> </dependency>
内容的提问来源于stack exchange,提问作者Abe
相关产品推荐
相关产品推荐

