Разве пакеты не должны совпадать с подкаталогами, в которых находится Java-файл? - PullRequest
8 голосов
/ 29 ноября 2011

Этим утром я писал несколько тренировочных программ для своей сертификации java и заметил, что неправильно набрал имя пакета, поэтому оно не соответствует подкаталогу, в котором находится файл java. Я скомпилировал код, ожидающий ошибку, но все скомпилированный файл - даже не предупреждение.

Я немного погуглил, и на большинстве прочитанных страниц говорилось, что имя пакета должно соответствовать подкаталогу. Мой опыт показывает, что это не так.

Когда я пытался запустить программу, она не работала, потому что файл .class находился в неправильном каталоге. Я переместил его в правильный каталог и получил эту ошибку:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sample/directory
/doesnt/even/exist/OtherPackageMemberModifiers (wrong name: com/sample/chap01/O
therPackageMemberModifiers)

Итак, я думаю, что Java-код будет компилироваться , если пакет и подкаталог не совпадают, но, похоже, нет способа запустить код, если Вы делаете это. Это правильно?

1 Ответ

17 голосов
/ 29 ноября 2011

Имя пакета должно соответствовать имени каталога, чтобы правильно найти файл class . не имеет для соответствия имени каталога во время компиляции для некоторых компиляторов (например, javac), хотя другие (например, Eclipse) по крайней мере выдадут предупреждение.

Способ "Запустите код, если вы это сделаете, «это создаст структуру каталогов и поместит ее туда вручную - сам файл класса полностью допустим.

Обратите внимание, что если вы используете флаг -d, javac создастподходящая иерархия каталогов для вас, независимо от местоположения источника.Например:

javac -d bin ClassInPackage.java

создаст все необходимые каталоги в bin для соответствия пакету, объявленному в ClassInPackage.java.

Сказав все это, я все равно Настоятельно рекомендуем сделать так, чтобы исходные каталоги соответствовали пакетам, даже если вы можете обойтись без него:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...