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
Author: Community, 2013-01-03

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:

  1. Twój plik HelloWorld.java powinien znajdować się w katalogu o nazwie main
  2. należy wykonywać javac i java z katalogu zawierającego main, a nie z samego main
  3. classpath powinien zawierać katalog, w którym katalog main jest, a nie main sam
  4. java oczekuje kanonicznej nazwy klasy do wykonania, więc main.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

 21
Author: Sergiu Dumitriu,
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
 9
Author: Ryan Stewart,
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)

 2
Author: Reed Richards,
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
 0
Author: Dixit Patel,
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