[Forge 1.8.9]:在 JAR 中包含依赖项

问题描述 投票:0回答:2

我一直在使用 Forge MDK 为 Minecraft 1.8.9 制作 Forge 模组。到目前为止,我的 mod 有 1 个依赖项,即 SnakeYAML。我将这一行:

compile 'org.yaml:snakeyaml:1.30'
添加到我的
build.gradle
文件中,以便在开发过程中拥有 SnakeYAML,但在构建 JAR 时它不会被包含在内。有没有办法将 SnakeYAML 也包含在我的 JAR 中?

gradle minecraft minecraft-forge snakeyaml
2个回答
0
投票

您可以创建一个胖罐子。总之,胖 Jar 在单个输出 Jar 中包含所有依赖项类和资源。我假设您正在使用 Gradle,因为这是一个 Forge 项目。

添加Shadow插件

plugins {
  id 'com.github.johnrengelman.shadow' version '7.1.2'
  id 'java'
}

然后将您的依赖项配置为在 SnakeYAML 中进行影子:

dependencies {
  implementation 'org.yaml:snakeyaml:1.30'
  ...
  shadow 'org.yaml:snakeyaml:1.30'
}

最后,使用“Shadow”下添加的 ShadowJar 任务来构建您的 fat Jar。您可能需要更改您正在使用的 gradle 版本的 Shadow 版本。请参阅文档了解您可能希望添加的任何配置。


0
投票

Forge 建议将依赖项着色到一个胖罐子中,他们有一组说明:https://github.com/MinecraftForge/ForgeGradle/blob/FG_1.2/docs/user-guide/shading.md

我不想使用阴影,有两个原因:

  • 着色不包括传递依赖
  • 根据定义,着色会重命名包。这可以帮助避免类路径上的冲突,但重命名包可能会给使用反射的库带来问题。

我做了一个简单的脂肪包,而不是阴影。我将运行时类路径上的所有内容都捆绑到 jar 中,但排除了

minecraft
依赖项类别。我的世界依赖项将在服务器上可用,如果有多个副本,运行时会抛出异常。


jar {
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
    from {
        configurations.runtimeClasspath.findAll { file ->
            // Exclude the transitive dependencies of minecraft dependency type, which should not go into the fat jar
            // when true, jar file is unzipped and added
            !configurations.minecraft.contains(file)
        }.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

额外库的包含必须发生在

jar
任务本身中,而不是像
fatJar
任务那样。原因是安装到服务器中的内容需要
gradle build
的输出,而不仅仅是
gradle jar
gradle fatJar
。否则,构建的 jar 不会经历混淆、反混淆和重新混淆的正确循环,这会导致
java.lang.NoSuchMethodError
反对 Minecraft API 本身。

© www.soinside.com 2019 - 2024. All rights reserved.