Java Exception ClassNotFoundException org.sqlite.core.NativeDB

Mystery1988

Ensign
Registriert
März 2015
Beiträge
204
Guten Abend,

ich versuche recht Verzweifelt eine Datenbankverbindung zu einer lokalen DB hinzubekommen.
Aus der IDE (Intellij) heraus funktioniert alles ohne Probleme.
Baue ich aber eine Jar, dann bekomme ich folgenden Stacktrace
Exception in thread "main" java.lang.NoClassDefFoundError: org.sqlite.core.Nativ
eDB
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(
NativeLibraries.java:383)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibra
ries.java:227)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibra
ries.java:169)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:1789)
at java.base/java.lang.System.load(System.java:675)
at shadow.org.sqlite.SQLiteJDBCLoader.loadNativeLibrary(SQLiteJDBCLoader
.java:299)
at shadow.org.sqlite.SQLiteJDBCLoader.extractAndLoadLibraryFile(SQLiteJD
BCLoader.java:257)
at shadow.org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBC
Loader.java:366)
at shadow.org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:6
8)
at shadow.org.sqlite.core.NativeDB.load(NativeDB.java:63)
at shadow.org.sqlite.SQLiteConnection.open(SQLiteConnection.java:240)
at shadow.org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:61)
at shadow.org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:2
8)
at shadow.org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:2
1)
at shadow.org.sqlite.JDBC.createConnection(JDBC.java:115)
at shadow.org.sqlite.JDBC.connect(JDBC.java:90)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251)
at database.Connect.connect(Connect.java:18)
at MultiBot.main(MultiBot.java:39)
Caused by: java.lang.ClassNotFoundException: org.sqlite.core.NativeDB
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinCla
ssLoader.java:822)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(C
lassLoaders.java:182)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:1111)
In der build.gradle ist die Abhängigkeit
implementation 'org.xerial:sqlite-jdbc:3.36.0.3'
definiert.
Ich habe auch schon die Lösung
Class.forName("org.sqlite.JDBC");
versucht, aber es hilft nichts =/
Wenn ich in die gebaute Jar schaue, sehe ich das die Abhängigkeit mit hinzugefügt wurden ist.
Die Zeilen, wo die Exception geworfen wird sieht wie folgt aus;
Java:
 Class.forName("org.sqlite.JDBC");
        try {
            // create a connection to the database
            conn = DriverManager.getConnection(url);
Hat irgendwer noch eine Idee wo das Problem liegen könnte?
 
Wie schaut denn dein gradle build file aus?
Wie ist die Konfiguraion zum Bauen des jar FIles? Wo im jar liegt denn die library? Also ist sie im Jar am korrekten Ort?
 
So sieht meine build.gradle komplett aus.
Code:
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation

plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '7.1.2'
}

group 'com.multibot'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}
sourceSets {
    all {
        dependencies {
            shadow localGroovy()
            shadow gradleApi()

            testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
            testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
            implementation 'com.discord4j:discord4j-core:3.2.2'
            implementation 'org.yaml:snakeyaml:1.30'
            implementation 'ch.qos.logback:logback-classic:1.2.11'
            implementation 'org.xerial:sqlite-jdbc:3.36.0.3'
        }
    }
}

task relocateShadowJar(type: ConfigureShadowRelocation) {
    target = tasks.shadowJar
}

jar {
    manifest {
        attributes(
                'Main-Class': 'MultiBot'
        )
    }
    finalizedBy("shadowJar")
}

tasks.shadowJar.dependsOn tasks.relocateShadowJar

test {
    useJUnitPlatform()
}
gebaut wird es über Gradle - >shadowJar
Der Pfad in der jar ist
shadow\org\sqlite\JDBC
 
Ich kenne shadowjar nicht, aber die Beschreibung passt perfekt auf den Problem.
Ich würde wetten, dass hier etwas beim Build schief läuft weil dort irgendeine config fehlt.

Also mein Tipp wäre, dir den Build über shadowjar nochmal genau anzuschauen.
 
So sieht das bei uns aus in der build.gradle mit shadowJar:

Code:
shadowJar {
    mergeServiceFiles()
    exclude "META-INF/*.SF"
    exclude "META-INF/*.DSA"
    exclude "META-INF/*.RSA"
    exclude "Thumbs.db"

Ggf. hilft dir das ja irgendwie weiter. (Den Rest habe ich entfernt, weil irrelevant)
 
@Burfi
Wenn ich mir nochmal in ruhe die Exception anschaue, dann sieht man das er org.sqlite umändert in shadow.org.sqlite und somit kann er ja die Klasse org.sqlite.core.NativeDB ja nicht finden, weil der neue "Pfad" ja shadow.org.sqlite.core.NativeDB ist.

@dominic.e
Ja ich habe auch mittlerweile die Idee, das ich wohl einige Sachen excluden sollte bezüglich des relocaten

Ganz einfach ich habe folgende Zeile gelöscht
tasks.shadowJar.dependsOn tasks.relocateShadowJar
damit relocated er das nicht mehr und es funktioniert nun auch alles. Grrrrr :grr: wenn man vorhandene Sachen einfach übernimmt..
 
Zuletzt bearbeitet:
ich denke auch dass es am shadowjar plugin liegt. sowas sollte eigentlich mit minimal-Konfiguration möglich sein. Schau mal hier:
https://www.baeldung.com/gradle-fat-jar

Dort ist auch ein Abschnitt mit Shadow-Jar plugin und das sollte auch ganz ohne config auskommen.

Das sollte eigentlich reichen.
 
Zurück
Oben