Spring Boot 3+Groovy项目Docker部署报错:主类及GroovyObject缺失
Spring Boot 3 Groovy应用Docker部署报错解决
问题场景
基于Spring Boot 3的Groovy应用,build.gradle配置如下:
plugins { id 'groovy' id 'org.springframework.boot' version '3.1.3' id 'io.spring.dependency-management' version '1.1.3' } group = 'myPackage' version = '0.0.1' java { sourceCompatibility = '17' } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-quartz' implementation 'org.apache.groovy:groovy' testImplementation 'org.springframework.boot:spring-boot-starter-test' // für getter und setter als anotation .... compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' // Mysql implementation 'mysql:mysql-connector-java:5.1.49' // Groovy JSON implementation 'org.apache.groovy:groovy-json:4.0.14' } tasks.named('test') { useJUnitPlatform() } tasks.named('jar') { manifest { attributes["Main-Class"] = "mypackage.MyProject" } }
使用以下Dockerfile部署:
FROM openjdk:17 COPY build/libs/MyProject-*-plain.jar MyProject.jar EXPOSE 8083 ENTRYPOINT ["java", "-jar", "MyProject.jar"]
运行时出现错误:
Error: Could not find or load main class mypackage.MyProject
Caused by: java.lang.NoClassDefFoundError: groovy/lang/GroovyObject
问题原因
- 使用了plain jar:
MyProject-*-plain.jar仅包含项目自身代码,未打包任何依赖(包括Groovy核心库),导致运行时找不到groovy/lang/GroovyObject类。 - 自定义jar任务冲突:手动配置
jar任务的Main-Class覆盖了Spring Boot的默认打包逻辑,Spring Boot应用的可执行jar需通过框架自带的启动类加载,而非直接指定业务主类。
解决方案
1. 调整build.gradle配置
移除自定义的jar任务配置,Spring Boot插件提供的bootJar任务会自动生成包含所有依赖的可执行fat jar,并正确配置启动逻辑:
// 删除以下自定义jar任务配置 // tasks.named('jar') { // manifest { // attributes["Main-Class"] = "mypackage.MyProject" // } // }
2. 构建可执行jar
执行Spring Boot专属的构建任务生成fat jar:
./gradlew bootJar
构建完成后,build/libs/目录下会生成类似MyProject-0.0.1.jar的文件(无-plain后缀)。
3. 修改Dockerfile
复制正确的可执行jar文件:
FROM openjdk:17 COPY build/libs/MyProject-*.jar MyProject.jar EXPOSE 8083 ENTRYPOINT ["java", "-jar", "MyProject.jar"]
验证
重新构建Docker镜像并启动容器,应用将正常加载所有依赖并启动,不会再出现主类找不到或Groovy依赖缺失的错误。
内容的提问来源于stack exchange,提问作者Christian Osterrieder
相关产品推荐
相关产品推荐

