Dependencies

Версия Minecraft
1.12.2
API
Forge
13
0
Добрый день, установил зависимость net.kyori:adventure-api:4.11.0, но при билде эта зависимость не работает, а когда устанавливаю на сервер, выдает ошибку о том, что классов не существует. Читал документацию и сказано, что необходимо изменить манифесты.

Зависимость, которую ставлю: тык

build.gradle:
Gradle (Groovy):
buildscript {
    dependencies {
        classpath "net.kyori:adventure-api:4.11.0"
        classpath "net.kyori:adventure-text-minimessage:4.11.0"
        classpath "net.kyori:adventure-text-serializer-gson:4.11.0"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

...

repositories {
    mavenCentral()

    maven {
        name = "sonatype-oss-snapshots1"
        url = "https://s01.oss.sonatype.org/content/repositories/snapshots/"
    }


    // Put repositories for dependencies here
    // ForgeGradle automatically adds the Forge maven and Maven Central for you

    // If you have mod jar dependencies in ./libs, you can declare them as a repository like so:
    flatDir {
        dir 'libs'
    }
}
dependencies {
    // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft' it is assumed
    // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied.
    // The userdev artifact is a special name and will get all sorts of transformations applied to it.
    minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2860'


    implementation "net.kyori:adventure-api:4.11.0-SNAPSHOT"
    implementation "net.kyori:adventure-text-minimessage:4.11.0-SNAPSHOT"
    implementation "net.kyori:adventure-text-serializer-gson:4.11.0-SNAPSHOT"


    // Real mod deobf dependency examples - these get remapped to your current mappings
    // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency
    // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency
    // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency

    // Examples using mod jars from ./libs
    // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}")

    // For more info...
    // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
    // http://www.gradle.org/docs/current/userguide/dependency_management.html
}

И соответственно ошибка:
Java:
[08:55:05 FATAL]: Error executing task
 java.util.concurrent.ExecutionException: java.lang.NoClassDefFoundError: net/kyori/adventure/text/minimessage/MiniMessage
        at java.util.concurrent.FutureTask.report(Unknown Source) ~[?:1.8.0_333]
        at java.util.concurrent.FutureTask.get(Unknown Source) ~[?:1.8.0_333]
        at net.minecraft.util.Util.func_181617_a(SourceFile:47) [h.class:?]
        at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:840) [MinecraftServer.class:?]
        at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:461) [nz.class:?]
        at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:778) [MinecraftServer.class:?]
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:624) [MinecraftServer.class:?]
        at java.lang.Thread.run(Unknown Source) [?:1.8.0_333]
Caused by: java.lang.NoClassDefFoundError: net/kyori/adventure/text/minimessage/MiniMessage
        at com.veild.trade.trademode.messages.TextComponent.get(TextComponent.java:18) ~[TextComponent.class:1.0]
        at com.veild.trade.trademode.TradeMode.onClientTradeRequest(TradeMode.java:160) ~[TradeMode.class:1.0]
        at com.veild.trade.trademode.packet.MessageTradeRequest$HandlerServer.lambda$onMessage$0(MessageTradeRequest.java:60) ~[MessageTradeRequest$HandlerServer.class:1.0]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_333]
        at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_333]
        at net.minecraft.util.Util.func_181617_a(SourceFile:46) ~[h.class:?]
        ... 5 more
Caused by: java.lang.ClassNotFoundException: net.kyori.adventure.text.minimessage.MiniMessage
        at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:191) ~[launchwrapper-1.12.jar:?]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_333]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_333]
        at com.veild.trade.trademode.messages.TextComponent.get(TextComponent.java:18) ~[TextComponent.class:1.0]
        at com.veild.trade.trademode.TradeMode.onClientTradeRequest(TradeMode.java:160) ~[TradeMode.class:1.0]
        at com.veild.trade.trademode.packet.MessageTradeRequest$HandlerServer.lambda$onMessage$0(MessageTradeRequest.java:60) ~[MessageTradeRequest$HandlerServer.class:1.0]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_333]
        at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_333]
        at net.minecraft.util.Util.func_181617_a(SourceFile:46) ~[h.class:?]
        ... 5 more
Caused by: java.lang.NullPointerException
        at net.minecraft.launchwrapper.LaunchClassLoader.findClass(LaunchClassLoader.java:182) ~[launchwrapper-1.12.jar:?]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_333]
        at java.lang.ClassLoader.loadClass(Unknown Source) ~[?:1.8.0_333]
        at com.veild.trade.trademode.messages.TextComponent.get(TextComponent.java:18) ~[TextComponent.class:1.0]
        at com.veild.trade.trademode.TradeMode.onClientTradeRequest(TradeMode.java:160) ~[TradeMode.class:1.0]
        at com.veild.trade.trademode.packet.MessageTradeRequest$HandlerServer.lambda$onMessage$0(MessageTradeRequest.java:60) ~[MessageTradeRequest$HandlerServer.class:1.0]
        at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) ~[?:1.8.0_333]
        at java.util.concurrent.FutureTask.run(Unknown Source) ~[?:1.8.0_333]
        at net.minecraft.util.Util.func_181617_a(SourceFile:46) ~[h.class:?]
        ... 5 more
>

Несмотря на все это, при запуске в DEBUG и runClient (в IDE) все зависимости подтягиваются.

Также пробовал compile "net.kyori:adventure-api:4.11.0-SNAPSHOT" и deobf, ничего из этого не помогает


Если делать complie выдает ошибку:
Java:
Build file 'D:\Mods\Veild\Trade\build.gradle' line: 149

A problem occurred evaluating root project 'TradeMode'.
> Could not find method compile() for arguments [net.kyori:adventure-api:4.11.0-SNAPSHOT] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
 
Последнее редактирование:
Решение
Конечно, в IDE имеется библиотека, она у тебя подгружается, а в проде откуда? Необходимо создавать fatJar, это можно сделать через shade (очень распространенный вариант), либо через shadow плагин, который заточен под это и имеет более большой функционал. Вот пример настройки Shadow под 5-й FG, под 1.12 подойдёт: https://gist.github.com/SizableShrimp/949e7c219bfc94487a45226b64ac7749
343
24
94
Конечно, в IDE имеется библиотека, она у тебя подгружается, а в проде откуда? Необходимо создавать fatJar, это можно сделать через shade (очень распространенный вариант), либо через shadow плагин, который заточен под это и имеет более большой функционал. Вот пример настройки Shadow под 5-й FG, под 1.12 подойдёт: https://gist.github.com/SizableShrimp/949e7c219bfc94487a45226b64ac7749
 
  • Like
Реакции: Fiks
13
0
Конечно, в IDE имеется библиотека, она у тебя подгружается, а в проде откуда? Необходимо создавать fatJar, это можно сделать через shade (очень распространенный вариант), либо через shadow плагин, который заточен под это и имеет более большой функционал. Вот пример настройки Shadow под 5-й FG, под 1.12 подойдёт: How to setup shading with Minecraft Forge
Сделал как было сказано, но это не помогло:
Java:
plugins {
    id 'net.minecraftforge.gradle' version '5.1.+'
    id 'com.github.johnrengelman.shadow' version '7.1.2'

}


group = 'com.veild.trade'
version = '1.0'

java {
    archivesBaseName = 'trade_mode'
    toolchain.languageVersion = JavaLanguageVersion.of(8)
}

apply plugin: 'idea'

idea {
    module {
        inheritOutputDirs = false
    }
}

minecraft {
    // The mappings can be changed at any time and must be in the following format.
    // Channel:   Version:
    // official   MCVersion             Official field/method names from Mojang mapping files
    // parchment  YYYY.MM.DD-MCVersion  Open community-sourced parameter names and javadocs layered on top of official
    //
    // You must be aware of the Mojang license when using the 'official' or 'parchment' mappings.
    // See more information here: https://github.com/MinecraftForge/MCPConfig/blob/master/Mojang.md
    //
    // Parchment is an unofficial project maintained by ParchmentMC, separate from MinecraftForge
    // Additional setup is needed to use their mappings: https://github.com/ParchmentMC/Parchment/wiki/Getting-Started
    //
    // Use non-default mappings at your own risk. They may not always work.
    // Simply re-run your setup task after changing the mappings to update your workspace.
    mappings channel: 'stable', version: '39-1.12'

    // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg')

    // Default run configurations.
    // These can be tweaked, removed, or duplicated as needed.
    runs {
        client {
            workingDirectory project.file('run')

            // Recommended logging data for a userdev environment
            // The markers can be added/remove as needed separated by commas.
            // "SCAN": For mods scan.
            // "REGISTRIES": For firing of registry events.
            // "REGISTRYDUMP": For getting the contents of all registries.
            property 'forge.logging.markers', 'REGISTRIES'


            // Recommended logging level for the console
            // You can set various levels here.
            // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels
            property 'forge.logging.console.level', 'debug'


            mods {
                rpgveild {
                    source sourceSets.main
                }
            }
        }

        server {
            workingDirectory project.file('run')

            property 'forge.logging.markers', 'REGISTRIES'

            property 'forge.logging.console.level', 'debug'


            mods {
                rpgveild {
                    source sourceSets.main
                }
            }
        }
    }
}

// Include resources generated by data generators.
sourceSets.main.resources { srcDir 'src/generated/resources' }
sourceSets { main { output.resourcesDir = output.classesDirs[0] } }

repositories {
    mavenCentral()
    // Put repositories for dependencies here
    // ForgeGradle automatically adds the Forge maven and Maven Central for you

    // If you have mod jar dependencies in ./libs, you can declare them as a repository like so:
//    flatDir {
//        dir 'libs'
//    }
}

configurations {
    shade
    implementation.extendsFrom shade
}

dependencies {
    // Specify the version of Minecraft to use. If this is any group other than 'net.minecraft' it is assumed
    // that the dep is a ForgeGradle 'patcher' dependency, and its patches will be applied.
    // The userdev artifact is a special name and will get all sorts of transformations applied to it.
    minecraft 'net.minecraftforge:forge:1.12.2-14.23.5.2860'

    shade "net.kyori:adventure-api:4.11.0"
    shade "net.kyori:adventure-text-minimessage:4.11.0"
    shade "net.kyori:adventure-text-serializer-gson:4.11.0"
    // Real mod deobf dependency examples - these get remapped to your current mappings
    // compileOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}:api") // Adds JEI API as a compile dependency
    // runtimeOnly fg.deobf("mezz.jei:jei-${mc_version}:${jei_version}") // Adds the full JEI mod as a runtime dependency
    // implementation fg.deobf("com.tterrag.registrate:Registrate:MC${mc_version}-${registrate_version}") // Adds registrate as a dependency

    // Examples using mod jars from ./libs
    // implementation fg.deobf("blank:coolmod-${mc_version}:${coolmod_version}")

    // For more info...
    // http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
    // http://www.gradle.org/docs/current/userguide/dependency_management.html
}

// Example for how to get properties into the manifest for reading at runtime.
jar {
    archiveClassifier = 'slim'
    manifest {
        attributes([
                "Specification-Title"     : "rpgveild",
                //"Specification-Vendor": "rpgveild authors",
                "Specification-Version"   : "1", // We are version 1 of ourselves
                "Implementation-Title"    : project.name,
                "Implementation-Version"  : project.jar.archiveVersion,
                //"Implementation-Vendor": "rpgveild authors",
                "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
        ])
    }
}

shadowJar {
    archiveClassifier = ''
    configurations = [project.configurations.shade]
    relocate 'net.kyori:adventure-api', "${project.group}.relocated.adventure-api"
    relocate 'net.kyori:adventure-text-minimessage', "${project.group}.relocated.adventure-text-minimessage"
    relocate 'net.kyori:adventure-text-serializer-gson', "${project.group}.relocated.adventure-text-serializer-gson"

    finalizedBy 'reobfShadowJar'
}

assemble.dependsOn shadowJar

reobf {
    shadowJar {}
}

jar.finalizedBy('reobfJar')

tasks.withType(JavaCompile).configureEach {
    options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation
}
 
1,074
72
372
В buildscript зачем пихать? Эта секция для подключения плагинов gradle. Библиотеки по умолчанию всегда используются только для компиляции и запуска в тестовой среде. Для релизной сборки нужен fatJar с зависимостями. Если мод делаешь для себя, можно обойтись - библиотеки тоже закинуть в mods и всё будет работать.
 
13
0
Если мод делаешь для себя, можно обойтись - библиотеки тоже закинуть в mods и всё будет работать.
Чисто эстетический вариант был и желание разобраться. Buildscript удалил, просто тут не менял, это были решения из англоязычных источников... Которые пробовал
 
Сверху