容器运行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' }
验证与构建
- 先本地测试胖Jar:
./gradlew shadowJar java -jar build/libs/JSON_validator-boot-docker-0.2.0.jar
确认能正常启动Grizzly服务器后,再构建Docker镜像:
./gradlew docker
内容的提问来源于stack exchange,提问作者Мария Волкова
相关产品推荐
相关产品推荐

