我从https://files.minecraftforge.net/net/minecraftforge/forge/index_1.16.5.html下载MDK 在 .jar 中构建我的 Forge mod 并启动 Minecraft 后,它给我一个错误,提示找不到依赖项。
在minecraft日志中写入以下内容:
java.lang.NoClassDefFoundError: org/json/simple/parser/JSONParser
at com.example.examplemod.JsonUtil.getConfig(JsonUtil.java:14)
在 build.gradlew 文件中我有下一个依赖项:
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
}
但是如果我使用 runClient(来自 Intellij IDE)运行 Minecraft,依赖项会成功安装,并且我的 mod 可以工作。
完整的build.gradlew文件内容:
plugins {
id 'eclipse'
id 'idea'
id 'maven-publish'
id 'net.minecraftforge.gradle' version '[6.0,6.2)'
}
version = mod_version
group = mod_group_id
base {
archivesName = mod_id
}
// Mojang ships Java 17 to end users in 1.18+, so your mod should target Java 17.
java.toolchain.languageVersion = JavaLanguageVersion.of(8)
println "Java: ${System.getProperty 'java.version'}, JVM: ${System.getProperty 'java.vm.version'} (${System.getProperty 'java.vendor'}), Arch: ${System.getProperty 'os.arch'}"
minecraft {
mappings channel: mapping_channel, version: mapping_version
copyIdeResources = true
runs {
// applies to all the run configs below
configureEach {
workingDirectory project.file('run')
property 'forge.logging.markers', 'REGISTRIES'
property 'forge.logging.console.level', 'debug'
mods {
"${mod_id}" {
source sourceSets.main
}
}
}
client {
// this block needs to be here for runClient to exist
}
server {
args '--nogui'
}
data {
// example of overriding the workingDirectory set in configureEach above
workingDirectory project.file('run-data')
// Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources.
args '--mod', mod_id, '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/')
}
}
}
// Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' }
repositories {
}
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
implementation 'com.googlecode.json-simple:json-simple:1.1.1'
}
tasks.named('processResources', ProcessResources).configure {
var replaceProperties = [
minecraft_version: minecraft_version, minecraft_version_range: minecraft_version_range,
forge_version: forge_version, forge_version_range: forge_version_range,
loader_version_range: loader_version_range,
mod_id: mod_id, mod_name: mod_name, mod_license: mod_license, mod_version: mod_version,
mod_authors: mod_authors, mod_description: mod_description,
]
inputs.properties replaceProperties
filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) {
expand replaceProperties + [project: project]
}
}
tasks.named('jar', Jar).configure {
manifest {
attributes([
'Specification-Title' : mod_id,
'Specification-Vendor' : mod_authors,
'Specification-Version' : '1', // We are version 1 of ourselves
'Implementation-Title' : project.name,
'Implementation-Version' : project.jar.archiveVersion,
'Implementation-Vendor' : mod_authors,
'Implementation-Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
])
}
finalizedBy 'reobfJar'
}
//tasks.named('publish').configure {
// dependsOn 'reobfJar'
//}
publishing {
publications {
register('mavenJava', MavenPublication) {
artifact jar
}
}
repositories {
maven {
url "file://${project.projectDir}/mcmodsrepo"
}
}
}
tasks.withType(JavaCompile).configureEach {
options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
}
我尝试使用 Gradlew 的影子插件,但我不明白如何正确安装它。 另外,我尝试按如下方式更改依赖项:(而不是编写minecraftLibrary的实现)
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
minecraftLibrary 'com.googlecode.json-simple:json-simple:1.1.1'
}
但是不起作用。
我尝试写 实现组:“com.googlecode.json-simple”,名称:“json-simple”,版本:“1.1.1” 但这是行不通的。
我最近为 Minecraft 1.20.1、Java 17、Forge 47.3.1 和 ForgeGradle 6 和 gradle 8.8 开发的 mod 的 json-simple/non-minecarft 依赖性也遇到了类似的问题。我通过执行这两个步骤成功解决了这个问题。即使你使用的是 gradlew,我认为它也应该能够在你的情况下工作,因为 gradlew 使用 gradle。
第一步应该让你的 mod 在运行 runClient 任务时找到这个依赖项。
在 build.gradle(w) 文件中:
dependencies {
minecraft "net.minecraftforge:forge:${minecraft_version}-${forge_version}"
// https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple
minecraftLibrary fg.deobf("com.googlecode.json-simple:json-simple:1.1.1")
}
您需要使用fg.deobf()来确保在运行时找到依赖项。
第二步是让你的 jar 文件包含依赖项,以便你的 mod 在开发环境之外找到它们(比如我的例子中的curseforge)。 使用这个thread,我了解到有两种方法:jar-in-jar 或 Shadowjar,并且该线程中有指向实现它们的有用指南的链接。 我不明白 jar-in-jar 方式,但按照教程解释的那样实现 Shadowjar 对我有用。