如何在Minecraft Fabric 1.21.4模组的.jar文件中仅打包指定外部非模组依赖
我完全懂你现在的困扰——想把那个Spotify的Java库打包进Fabric模组Jar里,结果用Shadow插件把Fabric自身的依赖也塞进去了,直接导致运行时冲突。别担心,有两种精准的方法可以解决这个问题,既能打包你需要的外部库,又能保持Fabric模组的正常结构。
方法一:用Shadow插件精准控制打包内容
首先确保你已经在build.gradle里应用了Shadow插件(如果还没加的话):
plugins { id 'fabric-loom' version '1.6-SNAPSHOT' // 适配1.21.4的Loom版本,记得用对应版本 id 'java' id 'com.github.johnrengelman.shadow' version '8.1.1' }
接下来配置Shadow Jar任务,明确指定只包含Spotify的库,同时排除所有Fabric、Minecraft相关的依赖:
shadowJar { // 只保留Spotify库的所有类 include 'se/michaelthelin/spotify/**' // 排除Fabric、Mojang、Minecraft的核心依赖,避免冲突 exclude 'net/fabricmc/**' exclude 'com/mojang/**' exclude 'net/minecraft/**' // 可选:如果Spotify库依赖了其他第三方库(比如OkHttp、Gson),也需要打包的话,添加对应的include // include 'okhttp3/**' // include 'com/google/gson/**' // 让生成的Jar覆盖默认的模组Jar(Fabric推荐这种方式,或者你可以设classifier为'all'区分) classifier = '' } // 让build任务自动触发shadowJar,这样执行build时直接生成正确的Jar build.dependsOn(shadowJar)
这种方式的好处是你能精确控制哪些内容被打包,适合需要细粒度调整的场景。
方法二:用Gradle的shadow配置简化依赖管理
如果你不想写一堆include/exclude,还有更简洁的方式:把需要打包的依赖从implementation换成shadow配置,Shadow插件会自动只打包这个配置下的依赖,而Fabric相关的modImplementation依赖依然保持独立。
修改你的dependencies块:
dependencies { minecraft "com.mojang:minecraft:${project.minecraft_version}" mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" // 把原来的implementation改成shadow,明确标记这个依赖需要被打包 shadow("se.michaelthelin.spotify:spotify-web-api-java:9.2.0") modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" }
然后简单配置Shadow插件即可:
shadowJar { classifier = '' } build.dependsOn(shadowJar)
这个方法更干净,因为你通过依赖配置直接区分了“需要打包的外部库”和“Fabric模组依赖”,减少了配置复杂度。
额外注意事项
依赖冲突处理:如果Spotify库用到的第三方库(比如OkHttp)和Minecraft/Fabric自带的版本冲突,你需要用Shadow的
relocate功能重命名这些库的包路径,避免类加载异常:shadowJar { relocate 'okhttp3', 'your.mod.id.lib.okhttp3' relocate 'com.google.gson', 'your.mod.id.lib.gson' }把
your.mod.id换成你自己的模组ID,这样第三方库就会被放到你模组独有的包路径下,不会和游戏自带的类冲突。验证打包结果:执行
./gradlew build后,打开生成的Jar文件(在build/libs目录下),检查是否包含se/michaelthelin/spotify目录,同时没有net/fabricmc等Fabric相关的目录,确保配置生效。
内容来源于stack exchange




