如何打包 forge mod 的依赖项同时避免 class 冲突?
How to pack dependencies for a forge mod while also avoiding class conflicts?
这是我目前的 build.gradle 文件(我删除了不必要的任务引用,它们不仅工作得很好,而且与当前问题无关):
buildscript {
repositories {
jcenter()
maven {
name = 'forge'
url = 'https://files.minecraftforge.net/maven'
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
}
}
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'java'
dependencies {
compile('some.library:here:1.2.3') // no extra modules
compile('other.library:here:4.5.6') // multiple modules
}
jar {
from project.configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
目前我有一个系统会自动将所有依赖项打包到我的 jar 文件中。我遇到的主要问题是,如果另一个 mod 或文件在我的 mod 之前加载相同的库,我最终会遇到 class 加载问题,因为我将加载相同的库class 两次(一个来自另一个罐子,一个来自我自己的)。
话说回来,有没有可能避免这样的问题呢?我将如何实际解释这样的事情? forge 是否有一种方法可以控制 class 加载到不会加载重复库的程度,因此不会有 class 冲突?
Minecraft Forge 支持一种叫做着色的功能来处理这个问题。当您遮蔽一个 jar 时,它会集成到您的 jar 中,但该包被重命名为唯一的东西(连同您的代码中对它的所有引用)。
来源:https://github.com/MinecraftForge/ForgeGradle/blob/FG_1.2/docs/user-guide/shading.md
这是我目前的 build.gradle 文件(我删除了不必要的任务引用,它们不仅工作得很好,而且与当前问题无关):
buildscript {
repositories {
jcenter()
maven {
name = 'forge'
url = 'https://files.minecraftforge.net/maven'
}
}
dependencies {
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
}
}
apply plugin: 'net.minecraftforge.gradle.forge'
apply plugin: 'java'
dependencies {
compile('some.library:here:1.2.3') // no extra modules
compile('other.library:here:4.5.6') // multiple modules
}
jar {
from project.configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
}
目前我有一个系统会自动将所有依赖项打包到我的 jar 文件中。我遇到的主要问题是,如果另一个 mod 或文件在我的 mod 之前加载相同的库,我最终会遇到 class 加载问题,因为我将加载相同的库class 两次(一个来自另一个罐子,一个来自我自己的)。
话说回来,有没有可能避免这样的问题呢?我将如何实际解释这样的事情? forge 是否有一种方法可以控制 class 加载到不会加载重复库的程度,因此不会有 class 冲突?
Minecraft Forge 支持一种叫做着色的功能来处理这个问题。当您遮蔽一个 jar 时,它会集成到您的 jar 中,但该包被重命名为唯一的东西(连同您的代码中对它的所有引用)。
来源:https://github.com/MinecraftForge/ForgeGradle/blob/FG_1.2/docs/user-guide/shading.md