Wyjątek w wątku "main" java.lang.NoClassDefFoundError: HelloWorld
Pracuję nad tym około godziny i thumbing przez Q & As na stackoverflow ale nie znalazłem proponowanego rozwiązania mojego problemu. Przykro mi, jeśli jest to duplikat, ale nie mogłem znaleźć żadnego duplikatu pytania z odpowiedzią, która rozwiązała mój konkretny problem.
Po raz pierwszy próbuję napisać i skompilować program java z terminala (do tej pory używałem Eclipse dla Javy i Vima do wszystkiego innego, ale czuję, że nadszedł czas, aby całkowicie przełączyć się na VIM). Oto mój aktualny kod HelloWorld:
package main;
public class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
Kompiluję i uruchamiam używając następujących poleceń (określając ścieżkę klasową, aby upewnić się, że nie jest to problem):
javac -cp "./" HelloWorld.java
java -cp "./" HelloWorld
To daje mi następujący komunikat o błędzie:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong name: main/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:480)
Wiem, że widzi plik HelloWorld.klasy i próbuje uzyskać dostęp do klasy HelloWorld, ponieważ jeśli zmienię polecenie run na:
java -cp "./" Foo
Otrzymuję zupełnie inny komunikat o błędzie:
Error: Could not find or load main class Foo
[[9]}wypróbowałem kilkadziesiąt stron wartych o rozwiązywaniu problemów i wymyślaniu krótkich, w tym następujących:
Wyjątek w wątku "main" java.lang.NoSuchMethodError: main
Http://introcs.cs.princeton.edu/java/15inout/mac-cmd.html
java -version
wydajność:
java version "1.7.0_07"
Java(TM) SE Runtime Environment (build 1.7.0_07-b10)
Java HotSpot(TM) Client VM (build 23.3-b01, mixed mode)
Mój system operacyjny to LinuxMint i uname -a
daje:
Linux will-Latitude-D620 2.6.38-8-generic #42-Ubuntu SMP Mon Apr 11 03:31:50 UTC 2011 i686 i686 i386 GNU/Linux
4 answers
Package main;
Oznacza to, że twoja klasa znajduje się w main
pakiecie, a jej kanoniczna nazwa to main.HelloWorld
.
Java wymaga, aby nazwy pakietów również były dublowane w strukturze katalogów. Oznacza to, że:
- Twój plik
HelloWorld.java
powinien znajdować się w katalogu o nazwiemain
- należy wykonywać
javac
ijava
z katalogu zawierającegomain
, a nie z samegomain
- classpath powinien zawierać katalog, w którym katalog
main
jest, a niemain
sam -
java
oczekuje kanonicznej nazwy klasy do wykonania, więcmain.HelloWorld
Więc, podsumowując:
Powinieneś mieć coś takiego myproject/main/HelloWorld.java
From myproject
, run javac main/HelloWorld.java
From myproject
, run java -cp ./ main.HelloWorld
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 03:36:58
Umieściłeś swoją klasę w pakiecie o nazwie "main", ale próbujesz traktować ją tak, jakby nie była w pakiecie. Ponieważ umieścisz package main;
na górze pliku źródłowego, musisz umieścić HelloWorld.java w ./ main, następnie uruchom javac ./main/HelloWorld.java
, a następnie java -cp . main.HelloWorld
.
Te polecenia zapewnią ci działający przykład, który próbujesz zbudować:
mkdir main
echo 'package main; public class HelloWorld { public static void main(String... args) { System.out.println("Hello World"); } }' > main/HelloWorld.java
javac main/HelloWorld.java
java -cp . main.HelloWorld
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 03:39:03
Jako początkujący możesz napotkać bardzo podobny scenariusz, w którym wynik błędu jest taki sam. Próbujesz skompilować i uruchomić prosty program (bez żadnego zestawu pakietów) i robisz to:
javac HelloWorld.java
java HelloWorld.class
To da ci tę samą Javę.lang.NoClassDefFoundError ponieważ java myśli, że HelloWorld jest Twoim pakietem i klasą Twoją nazwą klasy . Aby go rozwiązać wystarczy użyć
javac HelloWorld.java
java HelloWorld
Zobacz stronę Java - Lekcja: wspólne problemy (i ich rozwiązania)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-04 21:19:07
Problem:
Zasadniczo wyjątek w wątku "main" java.lang.NoClassDefFoundError
:
Oznacza, że klasa, którą próbujesz uruchomić, nie została znaleziona w ścieżce classpath.
Rozwiązanie : musisz dodać plik class lub .jar
, który zawiera tę klasę do java classpath. Gdy uruchamiasz klasę java z wiersza poleceń, musisz dodać kropkę (.)
java YourSingleClass -cp .
Do ścieżki klas, która mówi JVM, aby wyszukał klasy w aktualnym katalogu.
Jeśli jesteś prowadzenie klasy z A.plik jar, musisz dodać ten plik jar do classpath:
java org.somepackage.SomeClass -cp myJarWithSomeClass.jar
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-03 03:28:52