SQLite + jdbc + IntelliJ-Consumer = "No suitable driver found..."

Bernie_r

Mitglied
Servus Javaforum,

ich bin neu hier im Forum und das hier ist mein 1. posting (hoffe, der ist hier richtig platziert). Ich programmiere nur noch zum Spaß aus Langeweile (Rentner halt...).
Ich arbeite hier mit einem Win10-Rechner und nutze für Java-Entwicklung Intellij-Consumer.

Ich versuche mich gerade daran, eine kleine Testanwendung zu erstellen, die auf eine SQLiteDB zugreift.
SQLite + SQLitebrowser habe ich installiert und damit auch eine kleine DB erstellt. Auch den aktuellen jdbc-Treiber habe ich installiert (sqlite-jdbc-3.44.0.0.jar. )
Es gelingt mir aber nicht, mit einer Java-Anwendung auf die DB zuzugreifen. Ich bekomme immer die Fehlermeldung "No suitable driver found...". Im URL-String habe ich die db mit und ohne Pfadangabe und Extension angegeben. Das macht keinen Unterschied.

So sieht der Anfang des Sourcecodes, die Projektstruktur und die Dependecies in Intellij aus. Hat vielleicht jemand eine Idee, was ich da falsch mache?
Danke!
sqlite1.JPG
sqlite3.JPGsqlite4.JPGeine kleine DB erstellt. Einen
 

Anhänge

  • sqlite1.JPG
    sqlite1.JPG
    132,4 KB · Aufrufe: 0
Java:
 String DB_PATH = System.getProperty("user.home") + "/" + "testDB2.db";
 
 connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH);

       //  wenn sie zb in deinem  home ordner ist.
 
Ich habe die DB-Datei versuchsweise in den Projektordner (...\SQLiteTest4) gelegt, dann in den src-Ordner (...\SQLiteTest4/src) und in den ...out/production/SQLiteTest4. Ändert nix an der Fehlermeldung.
 
Merci! Ich habe die DB-Datei jetzt auch in mein home-Verzeichnis gelegt und deinen Code eingefügt. Leider keine Änderung. Ich vermute mittlerweile, dass der jdbc-Treiber entweder nicht gefunden wird, oder nicht funktioniert....
 
Versuche mal den Treiber manuell zu registrieren:
Java:
String sDriverName = "org.sqlite.JDBC";
Class.forName(sDriverName);
und prüfe mögliche Fehlermeldungen.
Um Pfadprobleme zu vermeiden kannst man auch "in memory" als URL testen:
Code:
jdbc:sqlite:memory:myDb?cache=shared
 
Frage wie schaut den deine (Maven) Pom Datei aus ?

Java:
 <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.44.0.0</version>
        </dependency>
 
Java:
String sDriverName = "org.sqlite.JDBC";
Class.forName(sDriverName);
und prüfe mögliche Fehlermeldungen.
Das liefert mir:
"C:\Program Files\Java\jdk-19\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.2.3\lib\idea_rt.jar=63341:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.2.3\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\Daten\Sprachen\Java\SQLiteTest4\out\production\SQLiteTest4;D:\Daten\Sprachen\Java\jdbc\sqlite-jdbc-3.44.0.0.jar Main
C:\Users\Bernhard/testDB2.db3
Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.sqlite.JDBC.<clinit>(JDBC.java:26)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:390)
at java.base/java.lang.Class.forName(Class.java:381)
at Main.main(Main.java:10)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)

Java:
jdbc:sqlite:memory:myDb?cache=shared
Das habe ich nicht verstanden. Damit kann IntelliJ nichts anfangen?
 
Das Problem ist, dass die Klasse vom SQLlite nicht geladen werden kann, weil eine Abhängigkeit nicht geladen werden kann.

Wenn Du eine Abhängigkeit hinzufügst, dann musst Du auch alle Abhängigkeiten von dieser Abhängigkeit hinzu fügen.

In Deinem Fall scheint das slf4j zu sein.

Das ist übrigens ein guter Grund, mit Maven oder Gradle zu arbeiten, da dies automatisch machen. Alternativ kannst Du die Abhängigkeit auch nicht so von Hand hinzu fügen sondern Du kannst IntelliJ sagen, dass die Abhängigkeit vom Maven Repository geladen werden soll. Dann fügt IntelliJ auch die weiteren Abhängigkeiten hinzu.

Um die Abhängigkeiten zu finden, kannst Du einfach mal schauen:
Maven Repository: org.xerial » sqlite-jdbc » 3.44.0.0 (mvnrepository.com)

Da findest Du dann slf4j-api als Abhängigkeit (Compile Dependency). Dem Link kannst Du folgen um dann auch die jar Datei herunter zu laden.

Und da bei slf4j noch eine konkrete Umsetzung benötigt wird, nimm Dir auch gleich noch dies mit:
Maven Repository: org.slf4j » slf4j-simple (mvnrepository.com)
 
Ich nutze Maven nicht, weil ich mich damit nicht auskenne. Ich nutze das IntelliJ Buildsystem.
Fange nochmal neu an und erstelle ein Maven Java Projekt.
Dann binde in die pom datei den code ein.

Das ist ein Standard Projekt nur den dependencies Teil habe ich der pom.xm hinzugefügt.
Und der JDBC ist ansprechbar.

Java:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>untitled4</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc -->
        <dependency>
            <groupId>org.xerial</groupId>
            <artifactId>sqlite-jdbc</artifactId>
            <version>3.44.0.0</version>
        </dependency>

    </dependencies>


</project>
 
Zuletzt bearbeitet:
@Bernie_r
Auch wenn ich immer sehr gerne zu Maven rate: Das Tool bringt natürlich auch eine gewisse Komplexität mit und diese musst Du auch weiterhin verstehen. Es werden also auch weitere Probleme auftauchen.

Der große Vorteil ist, dass man eine Textdatei hat, die man gut im Forum teilen kann.

Aber Du wirst eine erhöhte Komplexität haben, weil IntelliJ parallel mit zwei Buildsystemen arbeiten wird: Zum einen Maven und zum anderen nutzt IntelliJ weiterhin seine Modul-/Projektverwaltung. Das kann also auch direkt zu Problemen führen.

Der Umstieg ist zwingend notwendig aus meiner Sicht, wenn Du ernsthaft etwas mit Java machen willst, also z.B. später auch eine Anwendung weiter geben willst oder so. So dies nicht der Fall sein sollte, dann kann es evtl. auch durchaus sinnvoll sein, diesen Schritt einfach sein zu lassen.
 

Zurück
Oben