[eclipse] Problem z widocznością pliku jar po eksporcie

0

Witam.
Jestem w trakcie pisania aplikacji w Javie. Aplikacja korzysta z portów szeregowych. Wykorzystałem w tym celu bibliotekę javax/comm.jar. Aplikacja uruchamiana z poziomu Eclipse działa prawidłowo. Jednak po eksporcie projektu do pliku jar, program działa prawidłowo do momentu skorzystania z biblioteki. Dostaję wówczas na konsoli taki komunikat:

Exception in thread "Thread-6" java.lang.NoClassDefFoundError: javax/comm/CommPo
rtIdentifier
        at java.lang.Class.getDeclaredMethods0(Native Method)
        at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
        at java.lang.Class.getDeclaredMethod(Unknown Source)
        at java.awt.Component.isCoalesceEventsOverriden(Unknown Source)
        at java.awt.Component.access$500(Unknown Source)
        at java.awt.Component$3.run(Unknown Source)
        at java.awt.Component$3.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.awt.Component.checkCoalescing(Unknown Source)
        at java.awt.Component.<init>(Unknown Source)
        at java.awt.Container.<init>(Unknown Source)
        at java.awt.Window.<init>(Unknown Source)
        at java.awt.Window.<init>(Unknown Source)
        at java.awt.Dialog.<init>(Unknown Source)
        at java.awt.Dialog.<init>(Unknown Source)
        at javax.swing.JDialog.<init>(Unknown Source)
        at communication.PortChooser.<init>(PortChooser.java:104)
        at communication.Modem.showPortConectWindow(Modem.java:63)
        at communication.Modem.consume(Modem.java:138)
        at communication.Modem.run(Modem.java:121)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: javax.comm.CommPortIdentifier
        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)
        ... 21 more

Wypisując na konsoli String java.library.path otrzymuję:
Java library path
C:\WINDOWS\system32;.;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;;C:\Program Files\Java\jre1.6.0_07\bin;C:\DJGPP\bin
a java.class.path wygląda następująco:
aplikacja3.jar

Przed skorzystaniem z biblioteki comm.jar przeniosłem odpowiednie pliki do odpowiednich katalogów, zgdonie z tym co znalzłem na kilku forach, tj.
comm.jar should be placed in:

%JAVA_HOME%/lib
%JAVA_HOME%/jre/lib/ext

win32com.dll should be placed in:

%JAVA_HOME%/bin
%JAVA_HOME%/jre/bin
%windir%System32

javax.comm.properties should be placed in:

%JAVA_HOME%/lib
%JAVA_HOME%/jre/lib

Czy ktoś spotkał się może z podobnym problemem? Z góry dziękuje za pomoc.

0

Poszukaj informacji o Manifest (Class-Path)

0

Dzięki. Rzeczywiście w tym może siedzieć błąd. Mój Manifest wygląda tak:

Manifest-Version: 1.0
Sealed: true
Main-Class: controller.Startuj

Po dopisaniu linii wygląda tak:

Manifest-Version: 1.0
Sealed: true
Main-Class: controller.Startuj
Class-Path: /lib/comm.jar

Niestety po tej zmianie jar w ogóle się nie uruchamia. Dostaję komunikat

Exception in thread "main" java.lang.NoClassDefFoundError: controller/Startuj
Caused by: java.lang.ClassNotFoundException: controller.Startuj
        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)
Could not find the main class: controller.Startuj. Program will exit.
0

Napisałem kiedyś program do obsługi drukarek fiskalnych. Korzystam z innego pakietu (RXTXcomm, można go pobrać stąd http://www.rxtx.org/. Ma identyczne API więc przejście z jednego pakietu na drugi, to zamiana

import javax.comm.*;
//na
import gnu.io.*;

oraz umieszczenie w katalogu %WINDIR%/system32 pliku rxtxSerial.dll zamiast win32com.dll. (Plik javax.comm.properties w ogóle nie jest potrzebny).
Plik (na komputerach, na których program będzie tylko wykonywany) RXTXcomm.jar umieszczam tylko w katalogu ...Program Files/jre6/lib/ext. Manifest ma tylko dwa wiersze

Manifest-Version: 1.0
Main-Class: Posnet

i działa. Jar nazywa się Posnet.jar, uruchomiam program poleceniem java -jar Posnet.jar.
IMHO, błędny jest wiersz

Class-Path: /lib/comm.jar

W pliku comm.jar nie ma klasy controller.Startuj.

0

Zainstalowałem pakiet RXTXcomm. Zamieniłem linie

import javax.comm.*;
//na
import gnu.io.*; 

W momencie skorzystania z funkcji mojego programu, która wykorzystuje pakiet RXTXcomm program zatrzymał się na 30 sekund. Następnie wyświetliło się okno mojej aplikacji pokazujące dostępne porty. Przy próbie połączenia z jednym z portów (wirtualny port COM utworzony do komunikacji z modułem bluetooth) operacja nie powiodła się. Moduł bluetooth zachowuję się też inaczej niż przy korzystaniu z pakietu comm. W ciągu tych 30 sekund dioda sygnalizująca stan połączenia zachowywała się tak, jakby moduł się łączył z komputerem i rozłączał.
Dlatego wolałbym zostać przy pakiecie comm, który w pewnych warunkach jest już sprawdzony i poprawnie działa z tymi modułami.

Dziś zainstalowałem nową wersję Eclipse. Po wyeksportowaniu projektu do jara problem trochę się zmienił.
Nie otrzymuję już komunikatów o tym, że nie jest widoczna klasa comm. Problem polega na tym, że nie są wykrywane żadne porty COM w moim komputerze. Stan teraz jest taki: jeśli dodam java build path -> add external jar i wskażę plik comm.jar w lokalizacji c:\Sun\commapi to pod Eclipsem wszystko gra. Znajduje wszystkie porty, łączy się, przesyła dane. Jeśli wskażę plik comm.jar umieszczony w innym miejscu (np w katalogu lib aktualnego projektu) to nie działa nawet pod Eclipsem. Za to po wyeksportowaniu do jara nie działa niezależnie od tego na który plik comm.jar wskażę.

0

Nie piszesz czy umieściłeś w katalogu system32 plik rxtxSerial.dll. Ja zmieniłem pakiet (javax.comm => RXTXcomm) dlatego, że program miał działać na Windowsach, a pakiet javax.comm nie ma(i jak wtedy czytałem nie będzie miał) żadnych nowych wersji windowsowych.
Znalazłem u siebie na dysku notatkę, że jeśli korzysta się z pakietu javax.comm to trzeba w kodzie umieścić takie coś:

String driverName="com.sun.comm.Win32Driver";
try
{
    CommDriver driver=(CommDriver) Class.forName(driverName).newInstance();
    driver.initialize();
}
catch (Exception e)
{
    ...;
}
0

W innym miejscu znalazłem dokładniejszą uwagę. Wspomniany fragment jest konieczny jeśli korzysta się z pakietu javax.comm i program jest umieszczony w pliku jar.

0

Działa:) Dzięki za pomoc, szczególnie bo za rozwiązanie problemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1