我一直在使用 Forge MDK 为 Minecraft 1.8.9 制作 Forge 模组。到目前为止,我的 mod 有 1 个依赖项,即 SnakeYAML。我将这一行:
compile 'org.yaml:snakeyaml:1.30'
添加到我的 build.gradle
文件中,以便在开发过程中拥有 SnakeYAML,但在构建 JAR 时它不会被包含在内。有没有办法将 SnakeYAML 也包含在我的 JAR 中?
您可以创建一个胖罐子。总之,胖 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 版本。请参阅文档了解您可能希望添加的任何配置。
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 本身。