Понимание пакетов Java в реальных проектах

Я хочу понять методологию упаковки в реальных больших проектах.

Предположим, у нас есть пакет com.abc.xyz, и для этого у нас действительно есть путь вида com/abc/xyz.

Возможно ли иметь несколько одинаковых имен пакетов в другой структуре каталогов, например:

Путь к каталогу 1: /home/user1/project/module1/src/java/com/abc/xyz

Путь к каталогу 2:

/home/user1/проект/module2/src/java/com/abc/xyz

И, наконец, когда мы создаем jar для всего проекта, мы создаем jar относительно каталога com?

Когда какое-то приложение использует import com.abc.xyz, как оно узнает, к какому пути каталога относится пакет?

И, наконец, есть ли какая-нибудь хорошая книга/ресурс, в котором даны рекомендации по упаковке, как разделить проект на модули, названия пакетов и т.д.

Еще один момент: есть ли у проекта общее базовое имя пакета, как в приведенном выше случае: com.abc.xyz (например, org.apache.hadoop ).

Спасибо, Випин


person CuriousMind    schedule 04.04.2014    source источник


Ответы (4)


Пакеты, созданные в разных исходных каталогах, являются одним и тем же пакетом с точки зрения загрузчика классов. Также не имеет значения, находятся ли файлы классов в одном банке или в разных банках. JVM не делает различий в зависимости от того, откуда исходный код. (Конечно, если у вас есть две банки, загруженные разными загрузчиками классов, они будут обрабатываться по-разному.)

Один из случаев, когда у вас часто есть разные деревья исходного кода с одним и тем же пакетом, — это когда у вас есть тесты в другом каталоге (используя обычное соглашение Maven, где код находится в src/main/java, а тесты находятся в src/test/java), но с тем же пакетом, что и код, который они используют. Эти тесты могут выполнять защищенные и закрытые для пакета части тестируемого кода, поскольку они находятся в том же пакете, что и этот код.

Путь каталогов внутри jar должен начинаться в корне пакета. (Самый верхний каталог должен быть /, затем каталог с именем com или org или что-то еще и т. д.) Пакеты действительно образуют древовидную структуру, и когда вы помещаете свой код в файловую систему, вы в конечном итоге получаете иерархию пакетов, но язык сам по себе не распознает понятие "подпакет" (за исключением того, что пакеты, начинающиеся с java, являются специальными и получают особую обработку загрузчиком классов).

Организация кода в пакеты осуществляется разными людьми по-разному. Некоторым людям нравится организовывать свой код по слоям (помещая все контроллеры в один пакет, все сервисы в другой пакет, все даосы в еще один пакет), некоторым нравится организовывать свой код по функциям.

Послойная организация кода — это традиционный способ организации кода, который, по-видимому, является предпочтительной практикой в ​​сообществе Java. Одним из следствий этого является то, что когда код реализует функцию в виде вертикального среза под прямым углом к ​​структуре пакета (поскольку для этого может потребоваться новая конечная точка контроллера, новый метод службы и т. д.), то тесно связанные фрагменты кода для одна и та же функция оказывается разбросанной по разным каталогам. На веб-сайте Java Practices приводится интересный пример использования отдельных компонентов :

Пакет по функциям Пакет по функциям использует пакеты для отражения набора функций. Он пытается поместить все элементы, относящиеся к одной функции (и только этой функции), в один каталог/пакет. В результате получаются пакеты с высокой связностью и высокой модульностью, а также с минимальной связью между пакетами. Элементы, которые тесно связаны друг с другом, размещаются рядом друг с другом. Они не разбросаны по всему приложению. Также интересно отметить, что в некоторых случаях удаление функции может сводиться к одной операции — удалению каталога. (Операции удаления можно рассматривать как хороший тест на максимальную модульность: элемент имеет максимальную модульность только в том случае, если его можно удалить за одну операцию.)

Вот вопрос SO с вопросом о пакете по функциям или слоям.

person Nathan Hughes    schedule 04.04.2014
comment
Я советую начать хотя бы так, например: [com].[mydomain].[mymodule].[mysubmodule].[layer].[subcategory], где [mymodule] — это приложение или библиотека [mysubmodule] что-то вроде клиент, сервер, android, commons (для библиотек). Слой — это что-то вроде сервиса, пользовательского интерфейса, сети и так далее. - person kalamar; 04.04.2014

Да, вы можете создавать дубликаты пакетов в отдельных каталогах, но я не могу придумать веской причины для этого. Если классы в пакете имеют одинаковые имена, вы, безусловно, можете столкнуться с конфликтами пространств имен. Я не уверен, что означает «модуль» в этом контексте, но я бы рекомендовал

  • com.abc.module1.xyz
  • com.abc.module2.xyz

вместо. Это будут отдельные пакеты для загрузчика классов. Вы все еще можете сохранить структуру каталогов /home/user1/project/module1/ впереди, это не имеет значения.

person Erica Kane    schedule 04.04.2014

Из двух модулей у вас будет два отдельных jar-файла: module1.jar и module2.jar. Оба будут загружены в ClassLoader при запуске приложения.

Когда какое-то приложение использует import com.abc.xyz, как оно узнает, к какому пути каталога относится пакет?

Classloader справится с этим. http://www.javaworld.com/article/2077260/learn-java/the-basics-of-java-class-loaders.html

Если вы пытаетесь разработать многомодульное приложение, я рекомендую вам проверить инструмент Maven:

http://maven.apache.org/

Почему maven? Каковы преимущества?

Для руководства по организации пакетов вы можете просто найти фразу «пакеты java» в Google. http://www.tutorialspoint.com/java/java_packages.htm

person smajlo    schedule 04.04.2014

https://www.facebook.com/Niranthara-Jaya-JavaSocial-Media-Apps-Software-Project-Management-244119296136021/

Эта страница предназначена для людей, которые хотят знать, как работать с реальными проектами Java. Отправьте сообщение на эту страницу и ознакомьтесь со статьями.

person Matt Jerry    schedule 10.06.2018