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

容器运行Grizzly HTTP Server出现NoClassDefFoundError问题咨询

解决Gradle构建后运行Jar出现NoClassDefFoundError(Grizzly类缺失)的问题

你遇到的java.lang.NoClassDefFoundError: org/glassfish/grizzly/http/server/HttpServer本质是默认Gradle Jar任务只打包了你的业务代码,没有包含第三方依赖。Maven环境下你大概率用了maven-shade-plugin或类似插件生成了包含所有依赖的"胖Jar",但Gradle默认不做这个,所以运行时找不到Grizzly、Jersey这些依赖类。

下面是针对Docker场景的完整解决方案:

1. 引入Shadow插件生成胖Jar

Shadow是Gradle生态中最常用的胖Jar打包插件,能自动把所有依赖打包到同一个Jar里:

首先在buildscript中添加插件依赖:

buildscript {
    repositories {
        mavenCentral()
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath "gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.13.0",
        classpath "com.github.jengelman.gradle.plugins:shadow:7.1.2" // 添加Shadow插件
    }
}

然后应用Shadow插件:

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'com.palantir.docker'
apply plugin: 'com.github.johnrengelman.shadow' // 启用Shadow插件

2. 配置ShadowJar任务

配置Shadow生成的Jar的主类、名称等参数,和你原来的Jar配置保持一致:

shadowJar {
    manifest {
        attributes 'Main-Class': 'com.mycompany.json_validator.Main'
    }
    archiveBaseName = 'JSON_validator-boot-docker'
    archiveVersion = '0.2.0'
    archiveClassifier = '' // 去掉默认的"shadow"后缀,让Jar名称和原配置一致
}

3. 调整Docker任务依赖胖Jar

修改Docker配置,确保使用Shadow生成的胖Jar,并且让Docker构建依赖于ShadowJar任务:

docker {
    name "${project.group}/${shadowJar.baseName}"
    files shadowJar.outputs.files // 指向Shadow生成的胖Jar
    buildArgs(['JAR_FILE': "${shadowJar.archiveName}"])
}

// 确保先构建胖Jar,再构建Docker镜像
docker.dependsOn shadowJar

4. 优化依赖配置(可选)

你的依赖中同时声明了Jersey BOM和具体组件,建议把BOM放到dependencyManagement中,避免版本冲突:

dependencyManagement {
    imports {
        mavenBom 'org.glassfish.jersey:jersey-bom:2.17'
    }
}

dependencies {
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
    compile group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy'
    compile group: 'org.glassfish.jersey.media', name: 'jersey-media-multipart'
    compile group: 'org.glassfish.jersey.containers', name: 'jersey-container-grizzly2-http'
}

验证与构建

  1. 先本地测试胖Jar:
./gradlew shadowJar
java -jar build/libs/JSON_validator-boot-docker-0.2.0.jar

确认能正常启动Grizzly服务器后,再构建Docker镜像:

./gradlew docker

内容的提问来源于stack exchange,提问作者Мария Волкова

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:14:06