编译Jar后出现NoClassDefFoundError: com/google/auth/Credentials,开发环境正常
解决Fabric模组打包后Google API依赖缺失的问题
问题根源
你遇到的java.lang.NoClassDefFoundError是因为Gradle默认打包Fabric模组时,只会包含你编写的代码,implementation声明的第三方依赖不会被嵌入到最终的Jar文件中。IDE运行时会自动将所有依赖加入类路径,所以能正常运行,但游戏加载模组时找不到这些缺失的类。
解决步骤
1. 添加Shadow插件
Shadow插件可以帮你把第三方依赖嵌入到模组Jar中,同时支持重命名依赖包避免冲突。在build.gradle的plugins块中添加:
plugins { id 'fabric-loom' version '1.+' id 'com.github.johnrengelman.shadow' version '7.1.2' }
2. 修改依赖配置
将所有需要嵌入的第三方非模组依赖(比如Google API、dotenv、soundlibs等)从implementation改为shadow。保留modImplementation用于Fabric相关的模组依赖(比如Fabric API、simple-voice-chat)。修改后的依赖块示例:
dependencies { // Minecraft/Fabric基础依赖 minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" modRuntimeOnly "maven.modrinth:simple-voice-chat:fabric-1.20.1-2.4.24" // 第三方依赖改用shadow配置,会被嵌入到模组Jar shadow 'io.github.cdimascio:java-dotenv:5.2.2' shadow 'com.googlecode.soundlibs:tritonus-share:0.3.7.4' shadow 'com.googlecode.soundlibs:tritonus-all:0.3.7.2' shadow 'com.googlecode.soundlibs:jlayer:1.0.1.4' shadow 'com.googlecode.soundlibs:jorbis:0.0.17.4' shadow 'com.googlecode.soundlibs:vorbisspi:1.0.3.3' shadow 'com.googlecode.soundlibs:basicplayer:3.0.0.0' shadow 'com.google.guava:guava:24.1-jre' shadow 'org.threeten:threetenbp:1.3.6' shadow 'com.google.http-client:google-http-client:1.22.0' shadow 'com.google.cloud:google-cloud-texttospeech:2.18.0' shadow 'com.google.auth:google-auth-library-oauth2-http:1.16.0' shadow 'com.fasterxml.jackson.core:jackson-annotations:2.13.0' shadow 'com.fasterxml.jackson.core:jackson-databind:2.12.5' shadow 'org.slf4j:slf4j-api:1.7.32' shadow 'com.google.code.gson:gson:2.10.1' }
3. 配置Shadow插件(关键:避免依赖冲突)
添加Shadow配置,将嵌入的依赖重命名到你自己的模组包名下,防止和其他模组的相同依赖版本冲突。同时确保输出的Jar和Fabric Loom生成的Jar一致:
shadowJar { // 把第三方依赖包重命名到你的模组ID路径下,替换成你实际的模组ID relocate 'com.google', 'your.mod.id.google' relocate 'io.github.cdimascio', 'your.mod.id.dotenv' relocate 'com.googlecode.soundlibs', 'your.mod.id.soundlibs' relocate 'com.fasterxml.jackson', 'your.mod.id.jackson' // 其他依赖包同理,逐一添加relocate规则 // 对齐Loom的Jar命名规则,让build输出的Jar直接是带依赖的模组Jar archiveFileName.set("${archivesBaseName}-${project.version}.jar") destinationDirectory.set(file('build/libs')) } // 让build任务自动执行shadowJar,无需单独调用 build.dependsOn(shadowJar)
4. 验证依赖树(可选但推荐)
执行gradle dependencies命令查看依赖树,检查是否有重复或冲突的依赖。如果存在冲突,可以通过exclude排除冗余依赖,比如:
shadow('com.google.cloud:google-cloud-texttospeech:2.18.0') { exclude group: 'com.google.auth', module: 'google-auth-library-oauth2-http' }
测试打包
执行gradle build,在build/libs目录下生成的Jar就是包含所有依赖的模组Jar,将其放入游戏模组文件夹即可正常运行。
内容的提问来源于stack exchange,提问作者xxhawk8xx
相关产品推荐
相关产品推荐

