Класс находится в другом каталоге, чем тот, который указан в пакете - как получилось? - PullRequest
4 голосов
/ 27 января 2011

Следующие операторы кажутся беспокоящими:

robert@neghvar:~/tmp> cat org/foo/Bar.java 
public class Bar {

}

robert@neghvar:~/tmp> javac org/foo/Bar.java 
robert@neghvar:~/tmp> javap org.foo.Bar
Compiled from "Bar.java"
public class org.something.Bar extends java.lang.Object{
    public org.something.Bar();
}

Хотя файл класса Bar находится в каталоге org/foo и объявляет пакет org.something, компилятор не жалуется.У меня сложилось впечатление, что Java предписывает иерархию каталогов, которая следует за именем пакета.Я ошибся?Если да, каковы последствия смешивания имен пакетов?

Ответы [ 2 ]

3 голосов
/ 27 января 2011

Структура каталогов source не обязана следовать именам пакетов (хотя это почти всегда происходит по соглашению.)

Я думаю Солнце / Oracle javac, javap, java и т. Д. инструменты (и все другие известные мне реализации Java) - это то, что требует подкаталог для каждого правила имени компонента (вместе с загрузчиками классов по умолчанию). Я не смог найти ничего авторитетного, но это не является требованием спецификации языка Java:

2 голосов
/ 27 января 2011

Это чисто условно.Компилятор будет использовать имена пакетов.

Сказав это, обычно не стоит нарушать это соглашение.Это приведет к несогласованности (сгенерированные классы будут в каталогах, следующих за пакетом) и некоторой путанице!

...