2010-02-16 14 views
25

Używanie Eclipse Stworzyłem program SWT Hello World. Byłem w stanie uruchomić ten program z Eclipse i działało dobrze.Czy mogę uruchomić z programu wiersza poleceń utworzonego przez Eclipse?

W "/ home/myname/workspace/HelloWorldSWT" znalazłem dwa pliki: HelloWorldSWT.java i HelloWorldSWT.class. Chciałem wykonać odpowiedni program z wiersza poleceń. Najpierw próbował wpisać "Java HelloWorld" i mam następujący komunikat o błędzie:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld 
    at gnu.java.lang.MainThread.run(libgcj.so.90) 
Caused by: java.lang.ClassNotFoundException: HelloWorld not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}} 
    at java.net.URLClassLoader.findClass(libgcj.so.90) 
    at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at gnu.java.lang.MainThread.run(libgcj.so.90) 

Próbowałem też ten "Java Cp/home/roman/roboczy/HelloWorld.HelloWorld". W wyniku otrzymałem następujący komunikat o błędzie:

Exception in thread "main" java.lang.NoClassDefFoundError: loaded class HelloWorld.HelloWorld was in fact named HelloWorld 
    at java.lang.VMClassLoader.defineClass(libgcj.so.90) 
    at java.lang.ClassLoader.defineClass(libgcj.so.90) 
    at java.security.SecureClassLoader.defineClass(libgcj.so.90) 
    at java.net.URLClassLoader.findClass(libgcj.so.90) 
    at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at java.lang.ClassLoader.loadClass(libgcj.so.90) 
    at gnu.java.lang.MainThread.run(libgcj.so.90) 

Czy ktoś wie, co robię źle? Z góry dziękuję za pomoc.

Odpowiedz

2

Możliwe, że nie ładujesz biblioteki SWT poprawnie, w wyniku czego twoja klasa się nie załaduje.

Biblioteka SWT jest częścią słoików, które są już załadowane po uruchomieniu Eclipse, ale nie są załadowane w parametrze wiersza poleceń. Czy odpowiednio zmodyfikowałeś ścieżkę zajęć?

Oto stary artykuł o tym, jak zrobić tego rodzaju rzeczy w starszych wersjach Eclipse http://www.ibm.com/developerworks/opensource/library/os-ecgui1/ Trzeba będzie dzisiaj różne słoiki z najnowszej wersji fo Eclipse. Może nawet sprowadzić się do jednego słoja.

Zapoznaj się z SWT FAQ; przynajmniej dla Mac Carbon, możesz użyć pojedynczego słoika, założę się, że możesz to zrobić na inne platformy.

Ponadto, nie jestem w 100% pewny, czy można uruchomić Eclipse pod openJDK, co wydaje się być na waszej platformie.

+0

Dziękuję za odpowiedź. Jestem nowicjuszem w Javie i nie rozumiem esencji. Mam na myśli, że wydaje mi się dziwne, że musimy użyć kilku trudnych sposobów uruchomienia aplikacji SWG bez Eclipse. Jaki jest pożytek z programu napisanego w Eclipse, jeśli można go łatwo uruchomić tylko w środowisku Eclipse? – Roman

+0

Jeśli potrzebujesz prostej aplikacji GUI w Javie, nie używaj SWT, ale Swing. Jeśli używasz SWT, musisz zarządzać jego zależnościami. Tworząc aplikację RCP, platforma zarządza tymi zależnościami, ale w przypadku programów standardowych trzeba polegać na słojach SWT przy użyciu ścieżek klas. –

1

Jest to problem spowodowany tym, że JVM nie może znaleźć klasy HelloWorld, ponieważ ma klasę o nazwie HelloWorldSWT z główną metodą. spróbuj

java HelloWorldSWT

+0

Próbowałem "java -cp/home/roman/workspace/HelloWorldSWT.HelloWorldSWT" i "java HelloWorldSWT". Oba nie działały. – Roman

66

przejdź do perspektywy Debug i wybrać program, wystarczy uruchomić (gdzie jest napisane Termintated wartość wyjście ... w zakładce Debug) kliknij prawym przyciskiem myszy i wybierz Właściwości tam możesz zobaczyć całe polecenie wiersza poleceń uruchomione przez Eclipse.

Możesz uruchomić to samo polecenie w tym samym zaćmieniu dir (patrz w Run Configurations, Arguments, Working directory) i będzie działać.

+0

Nie mogę znaleźć "Perspektywy debugowania". Gdzie to jest? – Roman

+0

Wybierz, aby dodać perspektywę i możesz wybrać opcję Debuguj między innymi: – Persimmonium

+1

+1. Najprostszy sposób na znalezienie kompletnego polecenia do uruchomienia. Musiałem zmienić javaw.exe na java.exe, usunąłem niepotrzebne przełączniki i działało jak czar. – understack

7

Musisz dodać katalog, w którym Eclipse zapisuje plik HelloWorldSWT.class w ścieżce klas. Jest on definiowany podczas tworzenia projektu, np. "Bin", "build" lub "classes". Sprawdź właściwości projektu lub przeszukaj plik HelloWorldSWT.class.

Zakładając, że jest to katalog wewnątrz przestrzeni roboczej HelloWorldSWT i że klasa nie jest w żaden pakiet (domyślny pakiet) build, polecenie powinno być:

java -cp /home/roman/workspace/HelloWorldSWT/build HelloWorldSWT 

lub po prostu przejść do tego katalogu i zastosowanie:

java -cp . HelloWorldSWT 

EDIT:
-cp . oznacza, że ​​tylko rzeczywisty katalog służy do znajdowania plików klas. Musisz również dodać wszystkie biblioteki (pliki JAR lub inne katalogi) używane przez twój program (baza danych, SWT, ...).
Więcej szczegółów można przyjrzeć się dokumentacji: How Classes are Found, Setting the Classpath i java comand

+0

Znalazłem HelloWorldSWT.class. Znajduje się w "/ home/myname/workspace/HelloWorldSWT /". Przechodzę do tego katalogu i wpisuję "java -cp. HelloWorldSWT". W rezultacie otrzymuję komunikat o błędzie: Wyjątek w wątku "main" java.lang.NoClassDefFoundError: org.eclipse.swt.widgets.Display – Roman

+0

@Roman: jest to następny problem: musisz dodać wszystkie potrzebne biblioteki do ' Zmienna środowiskowa CLASSPATH lub do argumentu '-cp'; przykład: 'java -cp.: lib/somelib.jar: ... HelloWorldSWT'. Edytowałem swoją odpowiedź, dodając link do dokumentacji (jestem pewien, że pytanie CLASSPATH zostało odebrane gdzieś indziej na stackoverflow.com) –

1

nie został ustawiony prawidłowo wtedy ścieżki klasy.

Myślę, że zwykle wygodniej jest mieć IDE skompilować plik jar z wszystkimi bibliotekami poza bibliotekami i wykonać je z wiersza poleceń.

java -jar myprogram.jar

What is the use of the program written in Eclipse if it can be easily executed only within the Eclipse?

To bardzo dobre pytanie i wdrażania aplikacji Java jest naprawdę sztuką samą w sobie. Zarówno kompilacja jak i wykonanie są - jeśli nie są skomplikowane - co najmniej kłopotliwe, gdy wykonywane są ręcznie. Ale Eclipse i inne narzędzia, takie jak Netbeans, mogą ułatwić ci wykonywanie tych zadań, a nawet spakować twój program, aby inni, którzy nie używają tych narzędzi, mogli z łatwością wykonywać programy.

3

Wydaje mi się, że nie masz klasę o nazwie HelloWorldSWT``, ale raczej klasę o nazwie HelloWorldSWT w pakiecie o nazwie HelloWorldSWT (można to potwierdzić, przechodząc na pierwszej linii HellowWorldSWT.java, gdzie znajdą Państwo package HelloWorldSWT;

Jeśli tak, przejdź do katalogu nadrzędnego i wpisz

java HelloWorldSWT.HelloWorldSWT to będzie działać.

+0

Pracowałem dla mnie. Chciałem tylko przetestować Hello world – user2963623

1

Jeśli chcesz uruchomić program z argumentów wiersza poleceń z poziomu Eclipse można przejść do Run-> Uruchom konfiguracjach, w hich wyświetli okno z uruchomionym programem, a także okienko, w którym możesz wpisać argumenty.

1

Znalazłem inne szybkie i brudne rozwiązanie, jeśli chcesz po prostu zobaczyć wyjście w linii poleceń. Ale to jest nie jest dobrą praktyką na dłuższą metę!

  1. Usuń deklarację pakietu w kodzie (Eclipse złoży skargę i da ci czerwony znak, najpierw zignoruj ​​to), np. package hello;

  2. Zapisz.

  3. Otwórz linię komend i nawiguj, aż znajdziesz się w folderze src (użyj cd).

  4. Skompiluj plik java, np.javac HelloWorld.java

  5. Wykonaj plik klasy java, np. java HelloWorld

To powinno działać tak długo, jak jesteś w odpowiednim katalogu bez żadnych deklaracji pakietu w kodzie! Deklaracje pakietów powodują problemy .. i Eclipse jest skonfigurowany, aby upewnić się, że wszystko działa, dlatego dobrze jest mieć deklaracje pakietów. Alternatywnym sposobem obejścia tego problemu jest samodzielne skonfigurowanie ścieżki klasy (co zawsze mnie myli za każdym razem, gdy muszę to robić, co rzadko robię).

3

Wykonuję pewne obejście, aby w pełni wykorzystać zalety rozwiązania Eclipse. Poniżej znajduje się to, co znalazłem i działało dobrze dla mnie. Mam nadzieję, że pomoże: enter image description here

Powiązane problemy