Search code examples
javaminecraftspigot

NoClassDefFoundError while trying to use mongodb - Spigot Plugin


I want to write a plugin that can authenticate users by checking nosql database, but I bump into error when I try to run it in my server. I import the mongo driver using gradle but get NoClassDefFoundError. Here is the error code:

[04:17:15] [Server thread/INFO]: [mcloginx] mongo uri: mongodb://localhost:27017
[04:17:15] [Server thread/WARN]: java.lang.NoClassDefFoundError: com/mongodb/MongoClient
[04:17:15] [Server thread/WARN]:        at com.t2o0n321.mcloginx.utils.db.testConnect(db.java:21)
[04:17:15] [Server thread/WARN]:        at com.t2o0n321.mcloginx.mcloginx.onEnable(mcloginx.java:35)
[04:17:15] [Server thread/WARN]:        at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:263)
[04:17:15] [Server thread/WARN]:        at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:342)
[04:17:15] [Server thread/WARN]:        at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:480)
[04:17:15] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugin(CraftServer.java:492)
[04:17:15] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.enablePlugins(CraftServer.java:406)
[04:17:15] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.reload(CraftServer.java:879)
[04:17:15] [Server thread/WARN]:        at org.bukkit.Bukkit.reload(Bukkit.java:651)
[04:17:15] [Server thread/WARN]:        at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:27)
[04:17:15] [Server thread/WARN]:        at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:149)
[04:17:15] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.dispatchCommand(CraftServer.java:761)
[04:17:15] [Server thread/WARN]:        at org.bukkit.craftbukkit.v1_16_R3.CraftServer.dispatchServerCommand(CraftServer.java:746)
[04:17:15] [Server thread/WARN]:        at net.minecraft.server.v1_16_R3.DedicatedServer.handleCommandQueue(DedicatedServer.java:426)
[04:17:15] [Server thread/WARN]:        at net.minecraft.server.v1_16_R3.DedicatedServer.b(DedicatedServer.java:395)
[04:17:15] [Server thread/WARN]:        at net.minecraft.server.v1_16_R3.MinecraftServer.a(MinecraftServer.java:1127)
[04:17:15] [Server thread/WARN]:        at net.minecraft.server.v1_16_R3.MinecraftServer.w(MinecraftServer.java:966)
[04:17:15] [Server thread/WARN]:        at net.minecraft.server.v1_16_R3.MinecraftServer.lambda$0(MinecraftServer.java:273)
[04:17:15] [Server thread/WARN]:        at java.base/java.lang.Thread.run(Thread.java:829)
[04:17:15] [Server thread/WARN]: Caused by: java.lang.ClassNotFoundException: com.mongodb.MongoClient
[04:17:15] [Server thread/WARN]:        at org.bukkit.plugin.java.PluginClassLoader.loadClass0(PluginClassLoader.java:140)
[04:17:15] [Server thread/WARN]:        at org.bukkit.plugin.java.PluginClassLoader.loadClass(PluginClassLoader.java:99)
[04:17:15] [Server thread/WARN]:        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
[04:17:15] [Server thread/WARN]:        ... 19 more
[04:17:15] [Server thread/INFO]: [mcloginx] Can't connect to mongo

And here is my build.gradle file:

plugins {
    id 'java'
    id 'application'
}

group 'com.t2o0n321.mcloginx'
version '1.0.0'

repositories {
    mavenCentral()
    maven {url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/'}
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
    compileOnly 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT'
    // implementation 'org.mongodb:mongodb-driver-core'
    implementation 'org.mongodb:mongodb-driver-core:4.4.1'
    implementation 'org.mongodb:mongo-java-driver:3.12.10'
}

test {
    useJUnitPlatform()
}

I googled it but not getting solution yet. How can the problem be solved ?


Solution

  • The error occurred because of not exporting the jar with all dependencies. I solved it by using shadowJar to pack all dependencies togather.

    Add the following code to build.gradle

    plugins {
        id 'com.github.johnrengelman.shadow' version '7.0.0'
    }
    
    project.setProperty("mainClassName", "com.your.mainclass")
    
    shadowJar {
        manifest {
            attributes 'Main-Class': 'com.your.mainclass'
        }
    }
    

    And type ./gradlew shadowJar int terminal.

    You'll find the jar file in build/libs directory.