Если я не соблюдаю соглашение об именах java-пакетов, то .class не может быть найден командой "java", верно? - PullRequest
0 голосов
/ 08 ноября 2011

Это нормально, что "java Hello3" (с Hello3.class класс java) дает мне:

Exception in thread "main" java.lang.NoClassDefFoundError: Hello3 (wrong name: pp/Hello3)

Hello3.class - это скомпилированный двоичный файл Hello3.java. Этот Java-файл объявлен в каком-либо пакете "pp", но он не помещен в каталог "pp".

package pp;
public class Hello3 {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Моя команда java Hello3.java выполняется в том же каталоге, что и Hello3.java. Более того, даже команда "java -cp. Hello3" не работает! Может быть проблема с моей ??

Поскольку я получил ваше подтверждение от следующих ответов, я могу сделать наивный вывод: слишком легко создать класс, который никогда не работает. Просто объявите свой .java в пакете XXX, но не помещайте его в каталог XXX. ИМХО, думаю, это можно использовать как атаку!

Ответы [ 3 ]

3 голосов
/ 08 ноября 2011

Вам действительно нужно иметь Hello3.class в каталоге с именем pp. Каталог, содержащий pp, должен находиться в пути к классам. Предположим, этот каталог называется classes:

...
  |_ classes
         |_ pp
            |_ Hello3.class

Таким образом, команда для запуска вашей Java-программы должна быть

java -cp /the/path/to/classes pp.Hello3

или, в Windows

java -cp c:\the\path\to\classes pp.Hello3
2 голосов
/ 08 ноября 2011

Да, это нормально. Публичные классы Java должны находиться в каталоге, который соответствует имени пакета.

1 голос
/ 08 ноября 2011

Это должно быть java -cp <path_to_classpath_libs> pp.Hello3, а файлы Hello3.java & Hello3.class должны находиться в каталоге pp, как указано в объявлении пакета.

...