Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4)

OSchriever

Bekanntes Mitglied
Hi, ich habe ein Programm geschrieben, das auf eine sqlite-Datenbank zugreift. Das funktioniert auf dem PC einwandfrei, wenn ich die Jar und den lib Ordner aber auf den Raspberry kopiere und dort ausführen möchte, dann bekomme ich die exception

No suitable driver found for jdbc:sqlite


Hier ein paar Ausschnitte aus dem Code:

[CODE lang="java" title="für windows:"]public static final String DB_NAME = "settings.db";
public static final String CONNECTION_STRING = "jdbc:sqlite:C:\\Users\\oschr\\eclipse-workspace\\Dippmitteldosierer\\src\\" + DB_NAME;[/CODE]

[CODE lang="java" title="Connection dann geändert für Linux:"]public static final String CONNECTION_STRING = "jdbc:sqlite:/home/pi/Desktop/" + DB_NAME;[/CODE]

[CODE lang="java" title="Datenbank erstellen:"]String url = CONNECTION_STRING;
try {
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
connection = DriverManager.getConnection(url);
statement = connection.createStatement();

statement.execute("CREATE TABLE IF NOT EXISTS " + TABLE_VORWAHLMENGEN + "( " + COLUMN_VORWAHLNAME + " TEXT, " + COLUMN_VORWAHLMENGE + " INTEGER)");
statement.execute("CREATE TABLE IF NOT EXISTS " + TABLE_KALIBRIERUNGEN + "( " + COLUMN_KALIBRIERUNGNAME + " TEXT, " + COLUMN_KALIBRIERUNGMENGE + " INTEGER)");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
[/CODE]

Muss ich da noch etwas ändern oder warum gibt es da solche Probleme? Ich bin schon am verzweifeln....

Vielen Dank
 
Im Klassenpfad fehlen die jar(s), die die sqlite-Klassen und -Treiber enthalten. Es wird so etwas wie sqlite-jdbc-X.X.X.jar in der entsprechenden Version benötigt.
 
Die sqlite-jar habe ich als externe jar eingebunden... Sonst würde das Programm auf dem PC doch auch nicht laufen oder sehe ich das falsch? :/
 
Vielen Dank. Aber warum muss ich denn das alles angeben? Also ich meine nur ist das normal? Ich werde das nachher mal ausprobieren. Vielen Dank schonmal 😀
 
Die jar Datei muss halt im classpath mit drin sein. Bei Windows wird dies auch irgendwie der Fall sein. Das muss nicht zwangsläufig auf der Kommandozeile erfolgen, denn es gibt auch noch diverse andere Möglichkeiten, wie z.B. die Abhängigkeit mit in das jar File zu integrieren ("fat jar") oder im jar File einen Classpath im Manifest mit anzugeben ...
 
Wenn ich das so mache, dann bekomme ich auf dem Pi die ClassNotFoundException... Wie gebe ich denn in der Manifest den Classpath an? LG
 
Ich bin bei Java 9 geblieben weil ich es damals mit Java 11 versucht hatteund dann lief gar nichts mehr weil JavaFX nicht mehr enthalten war. Da habe ich 2 Tage dran rum gebastelt um das irgendwie zu laufen zu bekommen, habe es aber nicht auf die Reihe bekommen und bin dann wieder auf 9 gegangen. Da werde ich als nächstes dran arbeiten, aber ich hab irgendwie das Gefühl, dass das nicht zur Lösung menes Problems führt bzw. möchte ich ja auch verstehen was da passiert und die Fehler verursacht...
 
Ja aber mit den Angaben funktioniert es ja auch nicht. In meiner Manifest steht folgendes:
Manifest-Version: 1.0
Main-Class: de.schrieverkommt.Main
Class-Path: . Dippmitteldosierer_lib/sqlite-jdbc-3.8.6.jar

Warum steht im Class-Path denn die sqlite? Gehört das so?
 
Du bist doch selbst dafür zuständig, was in der manifest.mf drin steht. Also wenn das im Class-Path steht, dann hast du es da hinzugefügt. Es kann ja sein, dass es auf deinem Windows PC so passt. Auf deinem Pi ist aber möglicherweise der Ordner nicht vorhanden. Wenn du ein Programm weitergeben möchtest, dann musst du dich auch damit befassen, wie du dies Systemunabhängig tun kannst (z.B.: Installer). IDE's nehmen dir diese Arbeit nicht ab, können das aber erleichtern. Ein bewährtes Vorgehen ist z.B.: alles inkl. Ordnerstruktur in ein ZIP zu packen, so das dein Programm nach dem Auspacken richtig funktioniert.
 
Also ich hab es soweit, dass ich nur noch die Exception habe: Error opening Connection.
Habe ich den Pfad so wie in Frage 1 denn richtig unter Linux angegeben oder kann es sein, dass da ein Fehler drin ist? Die Database liegt auf dem Desktop.
LG
 
Du machst doch: e.printStackTrace(); - Was wird da ausgegeben? Existiert der Pfad überhaupt? Das kannst du prüfen mit:
[ -d "/home/pi/Desktop" ] && echo "Directory exists."
 
Stacktrace:
java.sql.SQLException: Error opening connection
at org.sqlite.core.CoreConnection.open(CoreConnection.java:140)
at org.sqlite.core.CoreConnection.<init>(CoreConnection.java:66)
at org.sqlite.jdbc3.JDBC3Connection.<init>(JDBC3Connection.java:21)
at org.sqlite.jdbc4.JDBC4Connection.<init>(JDBC4Connection.java:23)
at org.sqlite.SQLiteConnection.<init>(SQLiteConnection.java:45)
at org.sqlite.JDBC.createConnection(JDBC.java:114)
at org.sqlite.JDBC.connect(JDBC.java:88)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:677)
at java.sql/java.sql.DriverManager.getConnection(DriverManager.java:251)
at de.schrieverkommt.Main.<init>(Main.java:306)
at de.schrieverkommt.Main.main(Main.java:1091)
Caused by: java.lang.Exception: Error loading native library: /org/sqlite/native/Linux/arm/libsqlitejdbc.so
at org.sqlite.SQLiteJDBCLoader.loadSQLiteNativeLibrary(SQLiteJDBCLoader.java:243)
at org.sqlite.SQLiteJDBCLoader.initialize(SQLiteJDBCLoader.java:65)
at org.sqlite.core.NativeDB.load(NativeDB.java:53)
at org.sqlite.core.CoreConnection.open(CoreConnection.java:136)
... 10 more

Bei der Prüfung kommt Directory exists.
 
Caused by: java.lang.Exception: Error loading native library: /org/sqlite/native/Linux/arm/libsqlitejdbc.so
at
Das sieht doch schon vielversprechend aus - da fehlt eine native Komponente.

Hier wäre mein genereller Ansatz, statt sqlite H2 oder HSQLDB zu nutzen.

Mit sqlite habe ich unter java bisher keine Erfahrung und kenne dieAbhängigkeiten nicht. Ggf hat es Plattform abhängige Jar Files (wie es bei javafx z.B. der Fall ist) oder es erwartet externe Libraries. Das wird aber garantiert dokumentiert sein ...
 
Du benötigst einen arm-Port/Build von libsqlitejdbc.so für den RasPi. Im offiziellen JDBC-Treiber für SQLLite ist dieser nicht vorhanden. Du kannst die native Bibliothek aus den Quellen übersetzen. Einfacher wird es jedoch sein zu H2 oder HSQLDB zu wechseln. Der Aufwand ist minimal.
 
So ganz generell hat H2 gegenüber sqlit Vorteile, zB das es Typsicher ist und nicht in der als Integer deklarierten Column plötzlich Text steht. Macht also immer Sinn, über einen Wechsel nachzudenken – in der Applikation muss man, wenn man nicht völlig merkwürdige Dinge macht, nur den Pfad zur DB anpassen.
 

Zurück
Oben