Как происходит поиск пакетов в Java?
Не совсем понимаю работу пакетов. Если, например, какой-то проект находится в папке Project, один класс находится в src/java/persons, другой в src/java/cars, и мы в первом импортируем cars.Car, так вот, как задаётся путь, относительно которого ищется пакет cars (или может всегда начиная с java?). И так же со сторонними, например java.lang.Math, где он ищется?
Ответы (1 шт):
Прежде всего вам нужно почитать про classpath. В ответе на этот вопрос содержится отличная информация по тому, что это такое и для чего нужно.
Если коротко, то classpath содержит в себе два ключевых момента:
- пути до jar-архивов, используемых проектом
- путь до вершины иерархии пакетов приложения
Теперь по порядку по вашем вопросу. Любое java-приложение знает, откуда начинается его вершина иерархии пакетов. Это нужно для того, чтобы можно было спокойно оперировать только именами пакетов и классов, не таская за собой постоянно весь путь от корня файловой системы.
Этот путь прописывается в classpath приложения. Если вы запускаете проект в Intellij Idea, то обратите внимание на верхнюю строчку в консоли. Промотайте её до конца, и вы увидите достаточно знакомые вам названия папок. Это и будет тот самый путь.
И нет, необязательно вся эта история начинается с папок src или java. Просто это стандартные папки, которые использует, например, Intellij Idea, для простых проектов и проектов со сборщиком соответственно.
Если вы хотите потренироваться и поработать с вашим java-приложением из консоли, то вы легко сможете отталкиваться от любых папок с валидными названиями. Вот хорошая статья на Хабре по консольной работе с java.
Теперь по поводу java.lang.Math и других. У вас на компьютере есть jdk. Она помимо всего прочего содержит в себе стандартную java-библиотеку: набор классов, без которых нельзя себе представить никакое приложение.
При установке jdk вам автоматически прописывается переменная среды, посмотреть которую можно в ОС. Можно заметить, что она содержит в себе путь до jdk-папки, которая в свою очередь содержит разные jar-ники - и вот среди них уже есть те, которые хранят непосредственно классы стандартной библиотеки, включая, опять же, иерархию пакетов (по типу java.util и так далее).
Разумеется, любое java-приложение знает об этой переменной среды, поэтому в проекте вы также легко оперируете только названиями пакетов и классов при использовании стандартной библиотеки.
Наконец, насчёт сторонних классов. Все они содержатся в своих jar-файлах, которые также нужно указывать в classpath приложения. Для примера вы можете создать Maven-проект, подключить Хибернейт, запустить приложение и глянуть на ту же верхнюю строчку в консоли.
Вы заметите, что она сильно удлинилась, так как теперь содержит в себе ещё и пути до кучи разных Хибернейтовских jar-ников.
Аналогично происходит для всяких других библиотек и фреймворков. Просто это всё незаметно, так как все действия берут на себя среда разработки и сборщики, но если вы ставите целью понять проделываемые ими действия, то, как я уже говорил выше, можете попробовать компилировать и запускать проекты из консоли.