如何在使用 Shadow 插件的同时重定向(Relocate)包名

以酒石酸菌的 NetMusic 模组为例,其 build.gradle 中有如下指令(有修改):


shadowJar {
    dependencies {
        include(dependency("com.googlecode.soundlibs:mp3spi:1.9.5.4"))
        include(dependency("com.googlecode.soundlibs:jlayer:1.0.1.4"))
        include(dependency("com.googlecode.soundlibs:tritonus-share:0.3.7.4"))
    }

    // 在打包时将 javazoom.jl 整体移动到 com.github.tartaricacid.netmusic.soundlibs.javazoom.jl
    relocate 'javazoom.jl', 'com.github.tartaricacid.netmusic.soundlibs.javazoom.jl'
    // 在打包时将 javazoom.spi 整体移动到 com.github.tartaricacid.netmusic.soundlibs.javazoom.spi
    relocate 'javazoom.spi', 'com.github.tartaricacid.netmusic.soundlibs.javazoom.spi'
    // 在打包时将 org.tritonus 整体移动到 com.github.tartaricacid.netmusic.soundlibs.org.tritonus
    relocate 'org.tritonus', 'com.github.tartaricacid.netmusic.soundlibs.org.tritonus'
    
    // 重定向并合并所有可能出现的 Service Provider 定义文件
    // 在前置使用 Service provider 时必须使用此命令,否则运行时会出现问题
    mergeServiceFiles()
}

// 指示 ForgeGradle 对 shadowJar 的产出进行重混淆
// ForgeGradle 会新建名为 reobfShadowJar 的任务来完成重混淆
reobf {
    shadowJar {}
}
 
// 将重混淆产物作为 shadowJar 任务最终输出
shadowJar.finalizedBy('reobfShadowJar')
 
// 指示 Gradle 每次执行 build 任务时,必须执行 shadowJar 任务
build.dependsOn shadowJar