You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题原因

  1. 使用了plain jar:MyProject-*-plain.jar仅包含项目自身代码,未打包任何依赖(包括Groovy核心库),导致运行时找不到groovy/lang/GroovyObject类。
  2. 自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:53:26