Ответ 1
Предположим, вы сделали cd C: /projects
и HelloWorld.class
находится в C: /projects/com
, затем просто наберите:
java com.HelloWorld
Я продолжаю получать ошибки, когда делаю свой .class
частью package
и пытаюсь запустить его из cmd.
Вот код, который работает после использования javac
а затем java:
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
а затем код, который не работает:
package com;
class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
выдает мне эту ошибку после попытки запустить программу с помощью команды: java HelloWorld
:
Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld (wrong nam
e: com/HelloWorld)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
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)
at sun.launcher.LauncherHelper.checkAndLoadMain(Unknown Source)
Вот что я пытался сделать до сих пор:
java -cp . HelloWorld
java -cp . com.HelloWorld
java -cp . com/HelloWorld
java HelloWorld
java com.HelloWorld
java com/HelloWorld
Имейте в виду, что javac
возвращается без ошибок и что просто удаляет package com;
решает проблему. Иногда в других сценариях я получаю сообщение об ошибке, в котором говорится, что файл основного класса не найден или что-то в этом роде.
Что я делаю неправильно?
Предположим, вы сделали cd C: /projects
и HelloWorld.class
находится в C: /projects/com
, затем просто наберите:
java com.HelloWorld
Пакеты напрямую связаны с ожидаемым расположением каталога файла.
То есть, если у вас есть исходный файл с директивой пакета com
, ожидается, что файл будет находиться в каталоге com
.
В вашем примере HelloWorld
ожидается, что файл HelloWorld.java
будет сохранен в каталоге com
, например com\HelloWorld.java
Когда вы скомпилируете файл, он создаст файл класса с именем HelloWorld.class
в каталоге com
, например com\HelloWorld.class
Таким образом, когда Java ищет класс com.HelloWorld
, он фактически будет искать путь класса и добавляет к нему com\HelloWorld.class
до тех пор, пока не найдет ваш файл класса или не закончит путь класса
Пример
Итак, я скопировал пример HelloWorld.java
(с пакетом) на C:\java\com\HelloWord.java
Из командной строки я перешел в каталог C:\java
...
C:\java>dir com
Volume in drive C is OS
Volume Serial Number is ####-####
Directory of C:\java\com
09/08/2013 01:55 PM <DIR> .
09/08/2013 01:55 PM <DIR> ..
09/08/2013 01:55 PM 135 HelloWorld.java
Затем я скомпилировал HelloWorld.java
C:\java>javac com\HelloWorld.java
Затем я запустил его...
C:\java>java com.HelloWorld
Hello World!
Вам может потребоваться прочитать Packages учебник
Синтаксис:
java -classpath /path/to/package-folder <packageName>.<MainClassName>
Итак, вы можете попробовать: java com.HelloWorld
, который ожидал бы, что файл com/HelloWorld.class
будет присутствовать как путь к классам по умолчанию, указывает на текущий каталог (если не указан).
Если вы находитесь в другой папке, попробуйте указать classpath:
$ CLASSPATH=/path/to/package-folder/ java com.HelloWorld
Hello World!
$ java -cp /path/to/package-folder/ com.HelloWorld
Hello World!
$ cd /path/to/package-folder/ && java com.HelloWorld
Hello World!
Для получения дополнительных пояснений проверьте: Как запустить файлы Java.class?
Запустите программу из родительского каталога каталога com.
java com.HelloWorld
Предположим, файл находится в C: /projects/com/HelloWorld, и вы можете попробовать следующие способы.
1. java -cp c: /projects com.HelloWorld
2. cd c: /projects
java com.HelloWorld
(Пример 2 не работает во многих ситуациях, таких как процесс Java.)
если нет объявления пакета и будут небольшие изменения.
1. java -cp c: /projects/com HelloWorld
2. cd c: /projects/com
java HelloWorld
(Это не хорошо по той же причине.)
Альтернативно, относительный путь будет в порядке, но есть некоторый риск. Последнее помните, поместите файл класса в конец cmd.
Когда вы компилируете java-код, используйте -d, в вашем случае это будет
javac -d . com.HelloWorld.java
После указанной выше команды java-компилятор сгенерирует папку с именем "com", в папке "com" вы увидите свой HelloWorld.class
Затем в той же папке, где вы запускаете javac, запустите следующую команду
java com.HelloWorld
Попробуйте использовать абсолютный каталог или поместите свой HelloWorld.class в. \last_directory\com
1. java -cp .......\last_directory com.HelloWorld
2. java -cp .......\last_directory HelloWorld(with created com)
Создайте папку с именем com
в папке Java и поместите папку HelloWorld.java
в com
. Затем снова запустите javac
и java
.
Вам не нужен флаг -cp при запуске java-класса, -cp, необходимый при запуске класса или основной программы из двоичного файла (jar). При запуске основной программы из командной строки вам нужно убедиться, что у вас есть класс в той же структуре папок, что и имя пакета в java файле, например
home/user/foo java com.test.className
here classNmae class file and exist under home/user/foo/com/test
надеюсь, что это поможет.
Может возникнуть такая проблема, когда вы выполняете команду "java" непосредственно из папки ваших файлов ".class". Эта команда должна быть выполнена из родительского каталога проекта. Все это хорошо объяснено в следующей статье:
Сначала вы должны скомпилировать его, набрав эту команду в CMD, например, ваш файл находится в каталоге c:\directory:
C:\com>javac HelloWorld.java
После этого вы можете запустить результат, набрав:
c:\com>java HelloWorld