Ответ 1
Вам нужно установить путь к классу, чтобы найти скомпилированный класс:
java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2
Я скомпилировал программу HelloWorld, и я использую командную строку для ее запуска. Файл .class называется HelloWorld2.class
Файл находится в папке C:\Users\Matt\workspace\HelloWorld2\bin Вот что я получаю, когда я иду в командной строке, и набираю "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.
Я ожидал увидеть распечатку HelloWorld. Что я делаю не так? У меня установлен JDK.
Вам нужно установить путь к классу, чтобы найти скомпилированный класс:
java -cp C:\Users\Matt\workspace\HelloWorld2\bin HelloWorld2
Чтобы запустить файл класса Java из командной строки, синтаксис:
java -classpath /path/to/jars <packageName>.<MainClassName>
где packageName (обычно начинается с com
или org
) - это имя папки, в которой присутствует ваш файл класса.
Например, если ваше основное имя класса - это приложение и имя пакета Java вашего приложения - com.foo.app
, то ваш файл класса должен находиться в папке com/foo/app
(отдельная папка для каждой точки), поэтому вы запускаете свое приложение как:
$ java com.foo.app.App
Примечание: $
указывает приглашение оболочки, игнорирует его при вводе
Если ваш класс не имеет определенного имени package
, просто запустите его как: java App
.
Если у вас есть другие зависимости jar, убедитесь, что вы указали свой classpath параметр с помощью -cp
/-classpath
или с помощью переменной CLASSPATH
который указывает на папку с файлами jar/war/ear/zip/class. Итак, на Linux вы можете префикс команды: CLASSPATH=/path/to/jars
, в Windows вам нужно добавить папку в системную переменную. Если не задано, путь к пользовательскому классу состоит из текущего каталога (.
).
Учитывая, что мы создали образец проекта, используя Maven, как:
$ mvn archetype:generate -DgroupId=com.foo.app -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
и мы скомпилировали наш проект mvn compile
в нашем my-app/
dir, он сгенерирует наш файл класса в target/classes/com/foo/app/App.class
.
Чтобы запустить его, мы можем либо указать путь класса через -cp
, либо перейти к нему напрямую, проверьте примеры ниже:
$ 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!
Чтобы дважды проверить свой класс и имя пакета, вы можете использовать инструмент дизассемблера файла Java, например:
$ 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[]);
}
Примечание: javap
не будет работать, если скомпилированный файл был запутан.
Это может означать много вещей, но наиболее распространенным является то, что класс, содержащийся в файле, не имеет того же имени, что и сам файл. Итак, проверьте, называется ли ваш класс HelloWorld2.