在 .jar 中构建时未安装 Gradle 依赖项 |我的世界锻造版 1.16.5

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

我从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” 但这是行不通的。

java build.gradle minecraft-forge
1个回答
0
投票

我最近为 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 对我有用。

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