You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Minecraft Fabric 1.21.4模组的.jar文件中仅打包指定外部非模组依赖

如何在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

火山引擎 最新活动