Serielle Schnittstelle mit RXTX - JAR geht nicht

Angiii

Erfahrenes Mitglied
Hallo,

ich will über Java die serielle Schnittstelle ansteuern. Zwar gibt es hier schon unzählige Threads zu dem Thema, jedoch scheint mein Problem doch ein bißchen speziell zu sein.

Für die serielle Ansteuerung nutzte ich die RXTX-Bibiothek. Ich habe die Bibliothek inkl. dll so eingebunden, dass Sie in meinen Eclipse-Package Explorer unter dem Punkt "JRE System Library" angezeigt wird. Starte ich mein Programm in Eclipse, funktioniert es auch einwandfrei.
Sobald ich jedoch das Programm in ein JAR exportiere, lässt sich diese JAR nicht mehr starten. Erst wenn ich die betreffenden RXTX-Funktionen entferne, lässt sich mein JAR wieder ausführen Der Effekt tritt nicht nur bei meinem eigenen Programm auf, sondern auch bei Mustervorlagen aus dem Internet. Zum Beispiel dem letzten Beispiel (Beispiel mit der graphischen Oberfläche Swing) auf der Seite
auf h**p://www.mikrocontroller.net/articles/Serielle_Schnittstelle_unter_Java

Ich denke der Fehler liegt weniger am Quellcode, als an der Einbindung der RXTX-Biblothek in Eclipse. Jedoch wird die Bibliothek richtig angezeigt und in Eclipse selbst funktioniert ja auch alles prima.

Muss ich bei JARs und der Einbindung von externen Bibliotheken irgendetwas spezielles beachten?

Vielen Dank schonmal!
 
Ein "geht nicht mehr" hilft immer ziemlich wenig bei der Fehlersuche. Was bedeutet das konkret bei dir? Wird ein Fehler angezeigt? Hast dus mal auf der Konsole ausgeführt?

Hast du die Dlls mit angegeben beim Starten des Jars?
 
Sorry, dass hatte ich vergessen. Das lag vor allem daran, dass kein großer Fehlereffekt sichtbar ist. Ohne RXTX wird das JAR erstellt und ich kann dieses auch ganz normal durch Doppelklick starten. Mit RXTX wird das JAR erstellt und wenn ich dann drauf klicke, passiert absolut nichts. Keine Fehlermeldung, kein Programmabsturz, nichts. Zwei Sekunden Windows-Sanduhr, dass wars.

Ich hatte diesen Effekt schon bei früheren Versionen. Damals lag es vor allem an "Warnings" im Quellcode die ich nicht ausgebessert hatte.

Die DLL habe ich direkt in das JDK unter C:\Java\.... eingebunden. Mehr jedoch nicht. Kommt mir erst jetzt, dass das ein durchaus relevanter Punkt sein könnte. DLLs in Java hatte ich bisher nie gehabt. Werde das morgen mal testen.
 
Zuletzt bearbeitet:
Für das Jar doch mal mit java -jar auf der Konsole aus, damit du Fehlermeldungen sehen kannst.

DLLs bitte nicht in das Java-Verzeichnis legen sondern mit -Djava.library.path referenzieren und relativ zu deinem Jar hinlegen. Ansonsten kann man leicht vergessen die DLLs weiterzugeben und wundert sicht warum es woanders nicht läuft und Rechtetechnisch kann auch nicht jeder DLLs einfach in die Java-Installation packen.
 
Hab das jetzt mal im Konsolenfenster ausgeführt. Ich erhalte folgende Ausgabe:
Code:
C:\>java -Djava.library.path=C:\Programme\Java\jdk1.6.0_13\bin\rxtxSerial.dll -j
ar test2.jar
Exception in thread "main" java.lang.NoClassDefFoundError: gnu/io/PortInUseExcep
tion
Caused by: java.lang.ClassNotFoundException: gnu.io.PortInUseException
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClassInternal(Unknown Source)
Could not find the main class: rxtest. Program will exit.

Ich versteh das jetzt mal so, dass er die "gnu/io/PortInUseExcep
tion" nicht findet. Liegt es etwa doch eher an der RXTX-jar und nicht an der DLL?
 
Ich hab zwischenzeitlich noch einmal die RXTX-Wiki durchforstet und in einem versteckten Artikel folgenden Tipp gefunden:
For Windows, the Janel JAVA launcher can be used.

1. create a directory for your application, and save the Janel executable and lap-file to it;
2. create a subfolder named "classes" and save the jar-file of your application as well as the RXTXcomm.jar in it;
3. create a subfolder named "lib" and save the rxtxSerial.dll to it;
4. make the following entries in the lap-file:
o "-Djava.class.path=;${SELF_HOME}\classes\YourApp.jar;${SELF_HOME}\classes\RXTXcomm.jar;"
o "janel.main.class=YourAppMainClass"
o "janel.library.path.dir=${SELF_HOME}\lib"
Damit hab ich mein JAR zum laufen bekommen und kann es jetzt sogar als simulierte Exe ausführen. Ist doch schon mal was.
Da ich aber nicht immer den Umweg über "Janel" gehen will, interessiert mich natürlich schon noch der Grund für mein oben beschriebenes Problem. Mal sehen ob das noch was wird. Jedenfalls schon mal nett, wenn man zumindest einen Plan B hat.;-)
 

Neue Beiträge

Zurück