Skompilowałem program HelloWorld i używam wiersza polecenia, aby go uruchomić. Plik .class nosi nazwę HelloWorld2.class
Plik znajduje się w C: \ Users \ Matt \ workspace \ HelloWorld2 \ bin Oto, co otrzymuję, gdy przechodzę do wiersza poleceń i wpisuję „Java HelloWorld2”:
C:\Users\Matt>Java HelloWorld2
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld2
Caused by: java.lang.ClassNotFoundException: HelloWorld2
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: HelloWorld2. Program will exit.
Spodziewałem się wydrukowania HelloWorld. Co ja robię źle? Mam zainstalowany JDK.
java
compilation
Skizz
źródło
źródło
Odpowiedzi:
Aby znaleźć skompilowaną klasę, musisz ustawić ścieżkę klasy:
java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2
źródło
Aby uruchomić plik klasy Java z wiersza poleceń, składnia jest następująca:
gdzie nazwa_pakietu (zwykle zaczyna się od
com
luborg
) jest nazwą folderu, w którym znajduje się plik klasy.Na przykład, jeśli nazwa Twojej klasy głównej to Aplikacja, a nazwa pakietu Java Twojej aplikacji to
com.foo.app
, plik klasy musi znajdować się wcom/foo/app
folderze (osobny folder dla każdej kropki), więc uruchamiasz aplikację jako:Uwaga:
$
wskazuje na monit powłoki, zignoruj go podczas pisaniaJeśli klasa nie ma żadnej
package
nazwy zdefiniowane, po prostu uruchom jako:java App
.Jeśli masz jakieś inne zależności jar, upewnij się, że podałeś parametr classpath za pomocą
-cp
/-classpath
lub używającCLASSPATH
zmiennej, która wskazuje na folder z plikami jar / war / ear / zip / class . W systemie Linux możesz poprzedzić polecenie:,CLASSPATH=/path/to/jars
w systemie Windows musisz dodać folder do zmiennej systemowej. Jeśli nie jest ustawiona, ścieżka klasy użytkownika składa się z bieżącego katalogu (.
).Praktyczny przykład
Biorąc pod uwagę, że stworzyliśmy przykładowy projekt przy użyciu Mavena jako:
$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
i skompilowaliśmy nasz projekt
mvn compile
w naszymmy-app/
katalogu, wygeneruje on nasz plik klasytarget/classes/com/foo/app/App.class
.Aby go uruchomić, możemy określić ścieżkę do klasy za pośrednictwem
-cp
lub bezpośrednio do niej, sprawdź poniższe przykłady:$ find . -name "*.class" ./target/classes/com/foo/app/App.class $ CLASSPATH=target/classes/ java com.foo.app.App Hello World! $ java -cp target/classes com.foo.app.App Hello World! $ java -classpath .:/path/to/other-jars:target/classes com.foo.app.App Hello World! $ cd target/classes && java com.foo.app.App Hello World!
Aby dokładnie sprawdzić swoją klasę i nazwę pakietu, możesz użyć narzędzia do dezasemblacji plików klas Java, np .:
$ javap target/classes/com/foo/app/App.class Compiled from "App.java" public class com.foo.app.App { public com.foo.app.App(); public static void main(java.lang.String[]); }
Uwaga:
javap
nie zadziała, jeśli skompilowany plik został zaciemniony.źródło
Może to oznaczać wiele rzeczy, ale najczęstszym jest to, że klasa zawarta w pliku nie ma takiej samej nazwy jak sam plik. Sprawdź więc, czy Twoja klasa nazywa się również HelloWorld2.
źródło
C:/blah/blah/foldercontainJava
javac javafile.java
źródło
Musisz pisać java małymi literami i musisz dodać .class!
źródło