Skocz do zawartości

Java One More Time


neo_fox

Rekomendowane odpowiedzi

Za każdym razem gdy próbuje odpalić program pisany w java poza Eclipse dostaje komunikat:

 

Exception in thread "main" java.lang.NoClassDefFoundError: mainClass/class

 

Przeszukałem już wszystko co możliwe i każde rozwiązanie problemu sprowadza się do zdefiniowania zmiennych PATH. Cóż zmieniałem je w te i we wte i nic nie pomaga.

Ale mniejsza o to. Jeżeli załóżmy napisze jakiś program komercyjny i będę go chciał sprzedawać to jakoś nie wyobrażam sobie abym musiał klientom pisać dwutomowe dzieło na temat tego jak ten program zainstalować i jak skonfigurować system aby mój program chociaż uruchomić.

A więc wydaje mi się że musze go jakoś skompilować do wersji finalnej. Po spakowaniu do archiwum jar, dokonaniu odpowiednich wpisów w manifestu i próbie uruchomienia takiego programu dostaje ten sam komunikat błędu.

 

A więc co znowu pochrzaniłem ??

Odnośnik do komentarza
Udostępnij na innych stronach

Za każdym razem gdy próbuje odpalić program pisany w java poza Eclipse dostaje komunikat:

Exception in thread "main" java.lang.NoClassDefFoundError: mainClass/class

Moja szklana kula podpowiada mi, ze robisz cos takiego:

java mainClass.class

choc powinienes:

java mainClass

Przyznaje jednak, ze powodow tego komunikatu moze byc bez liku (uruchamianie, struktura programu - gdzie jest main, jakie pakiety, moze korzystasz z jar-ow, ktorych nie umiesciles w CLASSPATH, itp.).

Ale mniejsza o to. Jeżeli załóżmy napisze jakiś program komercyjny i będę go chciał sprzedawać to jakoś nie wyobrażam sobie abym musiał klientom pisać dwutomowe dzieło na temat tego jak ten program zainstalować i jak skonfigurować system aby mój program chociaż uruchomić.

Moze by tak klientowi instalator napisac? Kliknie sobie i juz, po bolu. Sa gotowe nawet, cross-platform zeby bylo smieszniej.

 

Pozdrawiam,

montresol

Odnośnik do komentarza
Udostępnij na innych stronach

Za każdym razem gdy próbuje odpalić program pisany w java poza Eclipse dostaje komunikat:

Exception in thread "main" java.lang.NoClassDefFoundError: mainClass/class

Moja szklana kula podpowiada mi, ze robisz cos takiego:

java mainClass.class

choc powinienes:

java mainClass

Wiedziałem że to coś prostego smile.gif - przyzwyczajenie do naciskania TAB w konsoli wink.gif

 

Moze by tak klientowi instalator napisac? Kliknie sobie i juz, po bolu.

 

Nie nabijaj się kurcze ze mnie sad.gif

 

Sa gotowe nawet, cross-platform zeby bylo smieszniej.

a mógłbyś podać jkieś przykłady?

Odnośnik do komentarza
Udostępnij na innych stronach

Moze by tak klientowi instalator napisac? Kliknie sobie i juz, po bolu.

Nie nabijaj się kurcze ze mnie sad.gif

Ech, nie to bylo moja intencja. Przeciez prosty skrypt .sh, .bat wiekszosc rzeczy juz zalatwia. JRE mozna rozprowadzac w swoim bundle wiec klopot ze sciaganiem i instalowaniem tego ustrojstwa na klienta maszynie jakby odpada. A jak chcemy juz konkretny wypas z instalatorkiem graficznym to jest tego na peczki (Google podpowiada: IzPack, VAInstall, FreeInstaller, Toolshed, JSmooth, Launch4J, Antigen). Zobacz jeszcze java-web-start bo to ciekawa technologia.

 

Pozdrawiam,

montresol

Odnośnik do komentarza
Udostępnij na innych stronach

JRE mozna rozprowadzac w swoim bundle wiec klopot ze sciaganiem i instalowaniem tego ustrojstwa na klienta maszynie jakby odpada.

 

Czyli, jeśli dobrze zrozumiałem, te biblioteki które wykorzystałem w programie trzeby dołączyć do pakietu?

Sorry jeśli głupie pytanie ale w C takie biblioteki kompilują się razem z programem.

 

A jak chcemy juz konkretny wypas z instalatorkiem graficznym to jest tego na peczki (Google podpowiada: IzPack, VAInstall, FreeInstaller, Toolshed, JSmooth, Launch4J, Antigen). Zobacz jeszcze java-web-start bo to ciekawa technologia.

dzięki

 

 

Trochę pokombinowałem i teraz mam tak:

Exception in thread "main" java.lang.UnsupportedClassVersionError: mainClass (Unsupported major.minor version 49.0)
       at java.lang.ClassLoader.defineClass0(Native Method)
       at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
       at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
       at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
       at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
       at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
       at java.security.AccessController.doPrivileged(Native Method)
       at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:274)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
       at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)

 

Jeśli dobrze rozumię to teraz po prostu nie znajduje bibliotek. Ale z tym to sobie chyba poradzę smile.gif

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli, jeśli dobrze zrozumiałem, te biblioteki które wykorzystałem w programie trzeby dołączyć do pakietu?

Bingo! Wszystkie jary, z ktorych korzysta sie w swoim kodzie, umieszcza sie pozniej w dystybuowanym sofcie. Oczywiscie trzeba miec do nich prawa (licencje).

 

Koniec koncow, typowy katalog naszego softu u klienta wyglada mnie wiecej tak:

+-katalog_programu
 +- bin   [skrypty startowe - bat, sh]
 +- lib   [jary potrzebne do uruchomienia - thirdparty libraries]
 +- doc [dokumentacja, itp]
 +moj_program.jar

Mozna dodatkowo umiescic katalog JRE z dystrybucji JAVY (przeczytaj licencje) - wtedy nie bedziemy musieli w skrypcie sprawdzac czy na kompie jest juz Java. Nie jest to moze eleganckie rozwiazanie ale najpewniejsze.

Trochę pokombinowałem i teraz mam tak:

Exception in thread "main" java.lang.UnsupportedClassVersionError: mainClass (Unsupported major.minor version 49.0)
       at java.lang.ClassLoader.defineClass0(Native Method)

 

Jeśli dobrze rozumię to teraz po prostu nie znajduje bibliotek. Ale z tym to sobie chyba poradzę smile.gif

 

Nie, to nie to. Chodzi prawdopodobnie o to, iz kod masz skompilowany nowsza wersja javy a probujesz go uruchomic za pomoca starszej. Wersja 49.0 oznacza kompilacje w JDK1.5. Co zwraca tymczasem u Ciebie polecenie 'java -version'? Czy nie przypadkiem 1.4.2?

 

Pozdrawiam,

montresol

Odnośnik do komentarza
Udostępnij na innych stronach

Co zwraca tymczasem u Ciebie polecenie 'java -version'? Czy nie przypadkiem 1.4.2?

[radek@Sigsiu-Radek mensa]$ java -version
java version "1.4.2_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_09-b05)
Java HotSpot(TM) Client VM (build 1.4.2_09-b05, mixed mode)
[radek@Sigsiu-Radek mensa]$

 

Czyli oczywiście miałeś rację. Ale ja już z tego nic nie rozumie. Instalowałem jre1.5.0 i mam też taki katalog /usr/java/jre1.5.0_04

Ja się chyba zastrzelę sad.gif

 

Próbowałem też skompilować mój program do kodu maszynowego przy pomocy gcj ale też wypluwa mnóstwo błędów sad.gif

 

Mozna dodatkowo umiescic katalog JRE z dystrybucji JAVY (przeczytaj licencje) - wtedy nie bedziemy musieli w skrypcie sprawdzac czy na kompie jest juz Java. Nie jest to moze eleganckie rozwiazanie ale najpewniejsze.

 

Czyli jeżeli używam biblioteki swing to muszę ją dołączyć do kodu źródłowego ??!!

Czy chodziło Ci raczej o takie biblioteki jak np: mysql-connector ??

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli oczywiście miałeś rację. Ale ja już z tego nic nie rozumie. Instalowałem jre1.5.0 i mam też taki katalog /usr/java/jre1.5.0_04

Ja się chyba zastrzelę sad.gif

 

Wyglada na to, ze gdzies masz jeszcze jre1.4.2 i na te wersje wskazuje PATH. Trzeba zmienic. Mozesz tez jeszcze raz skompilowac zrodla za pomoca jdk1.4.2 (javac). Oczywiscie nie uda sie to, jesli w kodzie uzywasz rzeczy specyficznych dla javy 1.5 (np. genericsy). Kompilacje do wersji 1.4 mozesz wlaczyc tez w Eclipse - Project/Properties/Java Compiler/JDK compliance.

 

Czyli jeżeli używam biblioteki swing to muszę ją dołączyć do kodu źródłowego ??!!

Czy chodziło Ci raczej o takie biblioteki jak np: mysql-connector ??

 

Swing jest zawarty w JRE wiec jesli user ma juz zainstalowane JRE to nie musisz w dystrybuowanym sofcie umieszczac JRE. Oczywiscie zawsze warto to w skrypcie uruchamiajacym/instalacyjnym sprawdzic. Co innego w przypadku dodatkowych bibliotek, np. sterownikow do baz danych, ktorych (poza mostem jdbc-odbc) w JRE nie ma. Te ostatnie musisz (o ile pozwala oczywiscie na to ich licencja) umiescic w katalogu dystrybuowanego softu. Aha... i nie musisz dolaczac niczego do kodu zrodlowego (pliki .java) tylko do wersji skompilowanej (.class czy lepiej nawet .jar).

 

PS> Korzystasz z jakiegos tutoriala/ksiazki? Rzeczy, o ktore pytasz w tym watku to podstawy. Polecam 'Thinking in Java' - do sciagniecia ze strony autora. Wkrotce pojawi sie czwarte wydanie.

 

Pozdrawiam,

montresol

 

Odnośnik do komentarza
Udostępnij na innych stronach

 

Wyglada na to, ze gdzies masz jeszcze jre1.4.2 i na te wersje wskazuje PATH.

kiedy właśnie że nie

export PATH=/usr/java/jre1.5.0_04/bin:$PATH
export JAVA_HOME=/usr/java/jre1.5.0_04
export CLASSPATH=.:/usr/java/jre1.5.0_04/

 

Swing jest zawarty w JRE wiec jesli user ma juz zainstalowane JRE to nie musisz w dystrybuowanym sofcie umieszczac JRE. Oczywiscie zawsze warto to w skrypcie uruchamiajacym/instalacyjnym sprawdzic. Co innego w przypadku dodatkowych bibliotek, np. sterownikow do baz danych, ktorych (poza mostem jdbc-odbc) w JRE nie ma. Te ostatnie musisz (o ile pozwala oczywiscie na to ich licencja) umiescic w katalogu dystrybuowanego softu. Aha... i nie musisz dolaczac niczego do kodu zrodlowego (pliki .java) tylko do wersji skompilowanej (.class czy lepiej nawet .jar).

Czyli jednak tak jak w C

 

PS> Korzystasz z jakiegos tutoriala/ksiazki? Rzeczy, o ktore pytasz w tym watku to podstawy. Polecam 'Thinking in Java' - do sciagniecia ze strony autora. Wkrotce pojawi sie czwarte wydanie.

 

Z tej książki. Tyle tylko że ona koncetruje się na opisie języka. Z tym akurat nie mam najmniejszych problemów. Jak do tej pory udało mi się stworzyć dosyć rozbudowaną aplikację. Tyle tylko że poza eclipse nigdzie nie moge jej uruchomić sad.gif

Odnośnik do komentarza
Udostępnij na innych stronach

export PATH=/usr/java/jre1.5.0_04/bin:$PATH
export JAVA_HOME=/usr/java/jre1.5.0_04
export CLASSPATH=.:/usr/java/jre1.5.0_04/

Lepiej byloby chyba pokazac co zwraca 'echo $PATH'. Daj jeszcze 'java -verbose | grep Opened' to sie przekonamy gdzie ukrywa sie ta przekleta java.

PS> Korzystasz z jakiegos tutoriala/ksiazki? Rzeczy, o ktore pytasz w tym watku to podstawy. Polecam 'Thinking in Java' - do sciagniecia ze strony autora. Wkrotce pojawi sie czwarte wydanie.

Z tej książki. Tyle tylko że ona koncetruje się na opisie języka.

A ta ksiazka nie uczy jak sie kompiluje z konsoli? Sciagnij JDK (nie JRE), napisz pod vimem prosty Hello World, skompiluj z konsoli za pomoca javac, uruchom za pomoca java. Jak sobie poradzisz to nie bedziesz mial problemow zeby powtorzyc to wszystko dla rozbudowanej aplikacji. Zobacz tez na ant - to javowy odpowiednik makefile'a.

 

Pozdrawiam,

montresol

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, serdeczne dziękuję Ci za wszelką pomoc. Na razie muszę sobie zrobić przerwę z Java bo już żona mi marudzi że nic innego nie robię wink.gif

 

Ale muszę przyznać że to fascynujący język smile.gif

 

PS:

[radek@Sigsiu-Radek mensa]$ echo $PATH
/usr/java/jre1.5.0_04/bin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X1 1R6/bin:/home/radek/bin
[radek@Sigsiu-Radek mensa]$

Odnośnik do komentarza
Udostępnij na innych stronach

Bardzo trudno się nie zgodzić. Generalnie Java jest językiem wysokiego poziomu, w którym abstrakcja sięga szczytów. Programując w Javie nie zajmuję się, że tak ujmę - pierdolami tylko implementuję konkretne zagadnienie, rozwiązuję konkretny problem.

Dla przykladu zwyczajne polączenie HTTP - nie muszę przejmować się otwieraniem gniazd (nie znam się zbyt dobrze ale chyba jest tak w C++, może ktoś mnie poprawi smile.gif ) lecz używam gotowego obiektu HttpUrlConnection, ustawiam naglowki żądnia i wszystko to, co faktycznie mnie interesuje!

Znajomym powtarczam zawsze jedno zdanie: Java jest jak klocki Lego - wszystko jest gotowe a zadaniem programisty jest "tylko" poskladać to wszystko do kupy. Mówię Wam, to daje niesamowitą frajdę. A jeszcze lepszą jak otrzymany kod jest elegancki i przejrzysty tak, że osoba, która pierwszy raz patrzy w taki kod od razu wiedziala o co chodzi. Z doświadczenia wiem, że nie jest to tak przyjemne np. w .NETcie...

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...