部署SpringBoot镜像至AWS集群时遇ClassNotFoundException问题求助
SpringBoot容器化部署AWS ECR时ClassNotFoundException问题解决
问题描述
开发SpringBoot应用,已通过Docker完成容器化并推送至AWS ECR,但部署镜像创建AWS集群服务运行任务时出现错误,日志如下:
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication 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:525) Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication at com.portfolio.quizapp.QuizappApplication.main(QuizappApplication.java:10)
已尝试调整依赖、更换版本及添加其他依赖,均未解决问题,当前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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.portfolio</groupId> <artifactId>quizapp</artifactId> <version>0.0.1-SNAPSHOT</version> <name>quizapp</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> <start-class>com.portfolio.quizapp.QuizappApplication</start-class> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-surefire-plugin --> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- <mainClass>com.portfolio.quizapp.QuizappApplication</mainClass> <layout>JAR</layout> --> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
解决方案
1. 移除错误的依赖配置
pom.xml的<dependencies>节点下包含了maven-surefire-plugin依赖,这是Maven插件,不属于项目依赖,直接删除这段:
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-surefire-plugin --> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.1.2</version> </dependency>
2. 修正spring-boot-maven-plugin配置
取消注释插件中的mainClass和layout配置,确保构建出包含所有依赖的可执行JAR:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <mainClass>com.portfolio.quizapp.QuizappApplication</mainClass> <layout>JAR</layout> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
3. 重新构建并推送镜像
执行以下命令构建可执行JAR:
mvn clean package
然后重新构建Docker镜像,推送到AWS ECR。
4. 检查Dockerfile正确性
确保Dockerfile使用java -jar启动可执行JAR,示例如下:
FROM openjdk:17-jdk-slim WORKDIR /app COPY target/quizapp-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java","-jar","/app/app.jar"]
内容的提问来源于stack exchange,提问作者Fu Chang
相关产品推荐
相关产品推荐

