【问题标题】:NoClassDefFoundError with local dependencies when build构建时具有本地依赖项的 NoClassDefFoundError
【发布时间】:2019-08-19 00:06:53
【问题描述】:

我正在用 Spigot 开发一个 Minecraft 插件,目前没有问题。

我添加了几个依赖项,因此一个依赖项引用 . jar pixearth-core-1.0 位于项目根目录下的文件夹 libs 中。当我开发时,我可以访问pixearth-core-1.0 库中的类。

当我编译项目时没有问题,但是当我在服务器上运行插件时,出现以下错误:

[01:58:17 ERROR]: Error occurred while enabling Idle v1.0-SNAPSHOT (Is it up to date?)
java.lang.NoClassDefFoundError: pixearth/idleplugin/database/DatabaseManager
        at pixearth.idle.Main.onEnable(Main.java:26) ~[?:?]
        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:264) ~[spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:339) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:403) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at org.bukkit.craftbukkit.v1_13_R1.CraftServer.enablePlugin(CraftServer.java:426) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at org.bukkit.craftbukkit.v1_13_R1.CraftServer.enablePlugins(CraftServer.java:340) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at net.minecraft.server.v1_13_R1.MinecraftServer.m(MinecraftServer.java:562) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at net.minecraft.server.v1_13R1.MinecraftServer.g(MinecraftServer.java:524) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at net.minecraft.server.v1_13_R1.MinecraftServer.a(MinecraftServer.java:423) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at net.minecraft.server.v1_13_R1.DedicatedServer.init(DedicatedServer.java:288) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at net.minecraft.server.v1_13_R1.MinecraftServer.run(MinecraftServer.java:686) [spigot.jar:git-Spigot-fe3ab0d-162bda9]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_221]
Caused by: java.lang.ClassNotFoundException: pixearth.idleplugin.database.DatabaseManager

pixearth/idleplugin/database/Databasemanager 类位于pixearth-core-1.0 库中。

只有pixearth-core-1.0 库在编译过程中不会被导出,但spigot-apiSQLiteQueryBuilder 会被导出。

我不知道为什么,你知道如何解决这个问题吗?

我的build.gradle

apply plugin: 'java'

group = pluginGroup
version = pluginVersion

sourceCompatibility = 1.8
targetCompatibility = 1.8

repositories {
    mavenCentral()
    maven {
        name = 'spigotmc-repo'
        url = 'https://hub.spigotmc.org/nexus/content/groups/public/'
    }
    maven {
        name = 'sonatype'
        url = 'https://oss.sonatype.org/content/groups/public/'
    }
    maven {
        url "https://jitpack.io/"
    }
    flatDir {
        dirs 'libs'
    }

}

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    compile 'org.spigotmc:spigot-api:1.13-R0.1-SNAPSHOT'
    compile 'com.github.alexfu:SQLiteQueryBuilder:0.1.1'
    compile files('libs\pixearth-core-1.0.jar')
}

import org.apache.tools.ant.filters.ReplaceTokens

processResources {
    from(sourceSets.main.resources.srcDirs) {
        filter ReplaceTokens, tokens: [version: version]
    }
}

【问题讨论】:

  • 您的 gradle 中没有任何内容表明您将依赖项打包到 jar 中,那么您到底在做什么?
  • @Frontear 我想在我的项目中导出 `pixearth-core-1.0' 库...如我的帖子所示...
  • 使用任何 IDE,例如 IntelliJ 或 Eclipse?

标签: java gradle minecraft bukkit


【解决方案1】:

您的插件在运行时调用库,但未找到。它需要由 spigot 作为插件单独加载,或者包含在您的 jar 中。有一个 Gradle 插件可以帮助您解决这个问题,称为 Shadow。你可以find it on GitHub。这是user guide,但总而言之,将其添加到您在 buildscript 中的插件中并使用任务shadowJar。任何具有运行时类路径的内容都将包含在您的最终 jar 中。

还建议使用implementation 而不是compile。由于兼容性问题,它在某些 Gradle 版本中仍然有效,但已被弃用并已从 Gradle 7 中删除。More information on Gradle docs site

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-09-16
    • 2021-07-31
    • 1970-01-01
    • 2017-11-29
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多