调试AWS S3上传视频的Spring Boot应用时出现类找不到异常
问题:Spring Boot + AWS S3应用启动失败,ClassNotFoundException报错
我在IntelliJ中开发基于Spring Boot、AWS、Angular的应用,编写了上传视频到AWS S3的API,但运行时出现如下错误:
C:\Users\anuragj\.jdks\openjdk-20.0.1\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:4137,suspend=y,server=n -javaagent:C:\Users\anuragj\AppData\Local\JetBrains\IdeaIC2023.1\captureAgent\debugger-agent.jar=file:/C:/Users/anuragj/AppData/Local/Temp/capture1.props -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\Users\anuragj\AppData\Local\Temp\classpath1805729470.jar com.exprojects.youtubeclone.YoutubeCloneApplication Connected to the target VM, address: '127.0.0.1:4137', transport: 'socket' 15:17:00.228 [main] ERROR org.springframework.boot.SpringApplication - Application run failed java.lang.IllegalArgumentException: Unable to instantiate io.awspring.cloud.autoconfigure.config.parameterstore.ParameterStoreConfigDataLocationResolver [org.springframework.boot.context.config.ConfigDataLocationResolver] at org.springframework.boot.util.Instantiator.lambda$static$0(Instantiator.java:53) at org.springframework.boot.util.Instantiator.instantiate(Instantiator.java:153) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at org.springframework.boot.util.Instantiator.instantiate(Instantiator.java:141) at org.springframework.boot.util.Instantiator.instantiate(Instantiator.java:126) at org.springframework.boot.context.config.ConfigDataLocationResolvers.<init>(ConfigDataLocationResolvers.java:80) at org.springframework.boot.context.config.ConfigDataLocationResolvers.<init>(ConfigDataLocationResolvers.java:56) at org.springframework.boot.context.config.ConfigDataEnvironment.createConfigDataLocationResolvers(ConfigDataEnvironment.java:158) at org.springframework.boot.context.config.ConfigDataEnvironment.<init>(ConfigDataEnvironment.java:148) at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.getConfigDataEnvironment(ConfigDataEnvironmentPostProcessor.java:114) at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:102) at org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor.postProcessEnvironment(ConfigDataEnvironmentPostProcessor.java:94) at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEnvironmentPreparedEvent(EnvironmentPostProcessorApplicationListener.java:102) at org.springframework.boot.env.EnvironmentPostProcessorApplicationListener.onApplicationEvent(EnvironmentPostProcessorApplicationListener.java:87) at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:131) at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:85) at org.springframework.boot.SpringApplicationRunListeners.lambda$environmentPrepared$2(SpringApplicationRunListeners.java:66) at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:120) at org.springframework.boot.SpringApplicationRunListeners.doWithListeners(SpringApplicationRunListeners.java:114) at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:65) at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:343) at org.springframework.boot.SpringApplication.run(SpringApplication.java:301) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) at com.exprojects.youtubeclone.YoutubeCloneApplication.main(YoutubeCloneApplication.java:10) Caused by: java.lang.NoClassDefFoundError: software/amazon/awssdk/awscore/client/builder/AwsClientBuilder at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3473) at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2652) at org.springframework.boot.util.Instantiator.instantiate(Instantiator.java:160) at org.springframework.boot.util.Instantiator.instantiate(Instantiator.java:150) ... 34 common frames omitted Caused by: java.lang.ClassNotFoundException: software.amazon.awssdk.awscore.client.builder.AwsClientBuilder at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) ... 39 common frames omitted Disconnected from the target VM, address: '127.0.0.1:4137', transport: 'socket'
已尝试执行mvn clean、install等命令,删除.m2仓库、重启IDE、修改依赖,但均未解决问题。期望应用能正常启动,以下是项目的POM.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.ex-projects</groupId> <artifactId>youtube-clone</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>backend</artifactId> <properties> <maven.compiler.source>20</maven.compiler.source> <maven.compiler.target>20</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-aws-dependencies</artifactId> <version>3.0.1</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.7.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign-core</artifactId> <version>2.2.10.RELEASE</version> </dependency> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-aws-starter</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-aws-core</artifactId> <version>3.0.1</version> </dependency> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-aws-autoconfigure</artifactId> <version>3.0.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>3.1.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> <version>3.0.7</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> <version>1.12.505</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>1.12.505</version> </dependency> <dependency> <groupId>com.ex-projects</groupId> <artifactId>frontend</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </project>
解决方案
问题根源
你的POM存在多个版本冲突问题:
- Spring Boot版本混合:同时使用了2.1.7.RELEASE和3.x版本,两者兼容性极差
- Spring Cloud AWS版本不一致:混合了3.0.1和3.0.2版本
- AWS SDK版本冲突:Spring Cloud AWS 3.x基于AWS SDK v2,但你引入了AWS SDK v1的
aws-java-sdk依赖,导致类路径冲突,这是ClassNotFoundException的直接原因 - Java版本配置矛盾:properties中指定Java 20,但maven-compiler-plugin配置为1.8
修复后的POM.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.ex-projects</groupId> <artifactId>youtube-clone</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>backend</artifactId> <properties> <maven.compiler.source>20</maven.compiler.source> <maven.compiler.target>20</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <spring-boot.version>3.1.0</spring-boot.version> <spring-cloud-aws.version>3.0.2</spring-cloud-aws.version> </properties> <dependencyManagement> <dependencies> <!-- 统一Spring Boot版本管理 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 统一Spring Cloud AWS版本管理 --> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-aws-dependencies</artifactId> <version>${spring-cloud-aws.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- 适配Spring Boot 3.x的Feign版本 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-openfeign-core</artifactId> <version>4.0.2</version> </dependency> <!-- 仅引入S3所需的Spring Cloud AWS Starter,自动依赖AWS SDK v2 --> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-aws-starter-s3</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>com.ex-projects</groupId> <artifactId>frontend</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <source>20</source> <target>20</target> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <!-- 适配Java 20的Surefire版本 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> <configuration> <skipTests>true</skipTests> </configuration> </plugin> </plugins> </build> </project>
关键修改点
- 加入
dependencyManagement统一管理Spring Boot和Spring Cloud AWS版本,彻底避免版本冲突 - 移除所有AWS SDK v1的依赖,改用
spring-cloud-aws-starter-s3(基于AWS SDK v2) - 统一Spring Cloud AWS版本为3.0.2,与Spring Boot 3.1.0完全兼容
- 更新
spring-cloud-openfeign-core到适配Spring Boot 3.x的版本 - 修正maven-compiler-plugin的source/target配置,与Java 20保持一致
- 更新maven-surefire-plugin版本以支持Java 20
后续操作
- 执行命令:
mvn clean install -U(强制更新依赖) - 重启IntelliJ,等待IDE重新加载依赖
- 再次启动应用即可
相关产品推荐
相关产品推荐

