Модуль 2. Урок 4. Пакеты в Java. — Введение в Java
Что такое пакеты?
Пакеты, по сути, являются файловой и логической структурой связей классов в мире java. Очень схоже с файловой системой компьютера. На уровне файловой системы пакеты это и есть папки, в которых лежат другие папки (подпакеты) и классы. Но пакеты не всегда описывают напрямую всю структуру проекта. На практике проект включает в себя различные ресурсы, а структура папок, которую мы назначаем как имена пакетов для наших классов — может быть лишь небольшой частью целого проекта. Ведь, кроме основного кода в пакетах, у нас должны быть еще и тесты, библиотеки или даже другие языки программирования в проекте в целом.
Как аналогию, можно привести пример с адресами.
Что такое пакет для класса
Для класса его пакет — это его местоположение в проекте, относительно других классов. Благодаря разделению классов на несколько пакетов — мы организовываем структуру программы.
Сильно забегая вперед скажу, что такое разделение нужно не только для красоты, но и для ограничения доступа к некоторым членам класса. Например:
Как создать класс внутри пакета?
Рассмотрим этот процесс поэтапно.
Сначала пишем имя любимого редактора в терминале, потом существующий путь, а потом имя будущего текстового файла. Пример для редактора nano :
Или с помощью sublime:
Если команда subl не найдена и Вы уверены в том, что sublime установлен — проверьте, в переменных среды окружения, наличие прописанного пути к папке, в которой лежит subl.
Можно и обычным блокнотом создать нужный файл в нужной директории. Создать сам файл можно и любым другим удобным для вас способом.
Файл создан. Но класса в нем нет. Создадим класс:
Теперь у нас есть и файл в нужной папке, и класс в файле. Но сам класс ничего не знает про то, что он принадлежит некому пакету. Исправим это:
Не забываем сохранять файл!
Ключевые моменты верного создания класса внутри пакета:
Корень пакетов
А как же задать корневой каталог (папку) как основу пакетов, в котором уже и происходит ветвление этих всех под-пакетов (под-папок)? Почему, например, папка io является корнем для классов проекта, а папка src — не является пакетом, да и вообще не входит в пакетную структуру проекта?
Пример содержимого класса OneMoreClass.java :
Пример содержимого класса SomeView.java :
Имена пакетов
Например, package com.MySuperLongPackageName.view — плохая практика именования пакетов.
Совокупность имен под-пакетов делает проект уникальным, не похожим на миллионы других. Даже если, в каждом проекте в мире, 100% будет класс Main.java — то они маловероятно пересекутся и помешают друг-другу. Но даже если пересекутся — это решаемо, рассмотрим это в дальнейших примерах.
Применение пакетов
Адреса (пакеты) классам, в нашем проекте, мы уже выдали. Они нужны для доступа классов друг к другу.
Как уже было сказано выше — пакет можно сравнить с адресом. Рассмотрим это на примере ветвления папок(пакетов).
Но прописывание таких длинных путей ( io.hexlet.xo.view.SomeView ) — просто не удобно. Поэтому, к нам на выручку, приходит импортирование.
Импортирование пакетов
Перепишем предыдущий пример с импортированием любых классов из пакета io.hexlet.xo.view :
Импортирование по умолчанию
Обратите внимание на строку System.out.println(«Some very important message!»); в классе SomeView :
Статическое импортирование
Как компилировать классы в пакетах
Как запускать классы в пакетах
Именно с него начинается работа самостоятельной java-программы. В остальных классах одной программы — этот метод не нужен.
А для запуска «пакетного» класса на исполнение требуется иной подход.
Полезные ссылки:
Работа с Java в командной строке
Каждая программа обычно содержится в отдельном каталоге. Я придерживаюсь правила создавать в этом каталоге по крайней мере две папки: src и bin. В первой содержатся исходные коды, во второй — результат компиляции. В данных папках будет структура каталогов, зависящая от пакетов.
Один файл
Можно сделать и без лишних папок.
Берем сам файл HelloWorld.java.
Переходим в каталог, где лежит данный файл, и выполняем команды.
В данной папке появится файл HelloWorld.class. Значит программа скомпилирована. Чтобы запустить
Отделяем бинарные файлы от исходников
Теперь сделаем тоже самое, но с каталогами. Создадим каталог HelloWorld и в нем две папки src и bin.
Компилируем
Здесь мы указали, что бинарные файлы будут сохраняться в отдельную папку bin и не путаться с исходниками.
Используем пакеты
А то, вдруг, программа перестанет быть просто HelloWorld-ом. Пакетам лучше давать понятное и уникальное имя. Это позволит добавить данную программу в другой проект без конфликта имен. Прочитав некоторые статьи, можно подумать, что для имени пакета обязательно нужен домен. Это не так. Домены — это удобный способ добиться уникальности. Если своего домена нет, воспользуйтесь аккаунтом на сайте (например, ru.habrahabr.mylogin). Он будет уникальным. Учтите, что имена пакетов должны быть в нижнем регистре. И избегайте использования спецсимволов. Проблемы возникают из-за разных платформ и файловых систем.
Поместим наш класс в пакет с именем com.qwertovsky.helloworld. Для этого добавим в начало файла строчку
В каталоге src создадим дополнительные каталоги, чтобы путь к файлу выглядел так: src/com/qwertovsky/helloworld/HelloWorld.java.
Компилируем
В каталоге bin автоматически создастся структура каталогов как и в src.
Если в программе несколько файлов
HelloWorld.java
Calculator.java
Adder.java
Если удивляет результат
Отладчик запускает свой внутренний терминал для ввода команд. Справку по последним можно вывести с помощью команды help.
Указываем точку прерывания на 9 строке в классе Calculator
Запускаем на выполнение.
Чтобы соориентироваться можно вывести кусок исходного кода, где в данный момент находится курссор.
Узнаем, что из себя представляет переменная а.
Выполним код в текущей строке и увидим, что sum стала равняться 2.
Поднимемся из класса Adder в вызвавший его класс Calculator.
Удаляем точку прерывания
Можно избежать захода в методы, используя команду next.
Проверяем значение выражения и завершаем выполнение.
Хорошо бы протестировать
Запускаем. В качестве разделителя нескольких путей в classpath в Windows используется ‘;’, в Linux — ‘:’. В консоли Cygwin не работают оба разделителя. Возможно, должен работать ‘;’, но он воспринимается как разделитель команд.
Создадим библиотеку
Класс Calculator оказался полезным и может быть использован во многих проектах. Перенесем всё, что касается класса Calculator в отдельный проект.
Измените также назавания пакетов в исходных текстах. В HelloWorld.java нужно будет добавить строку
Надо узнать, что у библиотеки внутри
Можно распаковать архив zip-распаковщиком и посмотреть, какие классы есть в библиотеке.
Информацию о любом классе можно получить с помощью дизассемблера javap.
Лучше снабдить библиотеку документацией
Изменим для этого класс калькулятора.
Документацию можно создать следующей командой. При ошибке программа выдаст список возможных опций.
В результате получиться следующее
Можно подписать jar-архив
Если требуется подписать свою библиотеку цифровой подписью, на помощь придут keytool и jarsigner.
Генерируем подпись.
Генерируем Certificate Signing Request (CSR)
Содержимое полученного файла отправляем в центр сертификации. От центра сертификации получаем сертификат. Сохраняем его в файле (например, qwertokey.cer) и импортируем в хранилище
Файл qwertokey.cer отправляем всем, кто хочет проверить архив. Проверяется он так
Использование библиотеки
Есть программа HelloWorld, которая использует библиотечный класс Calculator. Чтобы скомпилировать и запустить программу, нужно присоединить библиотеку.
Компилируем
Собираем программу
Это можно сделать по-разному.
Первый способ
Здесь есть тонкости.
В строке
не должно быть пробелов в конце.
Вторая тонкость описана в [3]: в этой же строке должен стоять перенос на следующую строку. Это если манифест помещается в архив сторонним архиватором.
Программа jar не включит в манифест последнюю строку из манифеста, если в конце не стоит перенос строки.
Ещё момент: в манифесте не должно быть пустых строк между строками. Будет выдана ошибка «java.io.IOException: invalid manifest format».
При использовании команды echo надо следить только за пробелом в конце строки с main-class.
Второй способ
В данном способе избегаем ошибки с пробелом в main-class.
Третий способ
Включили код нужной библиотеки в исполняемый файл.
Запуск исполняемого jar-файла
Файл calculator.jar исполняемым не является. А вот helloworld.jar можно запустить.
Если архив был создан первыми двумя способами, то рядом с ним в одном каталоге должна находится папка lib с файлом calculator.jar. Такие ограничения из-за того, что в манифесте в class-path указан путь относительно исполняемого файла.
При использовании третьего способа нужные библиотеки включаются в исполняемый файл. Держать рядом нужные библиотеки не требуется. Запускается аналогично.
Как быть с приложениями JavaEE
Аналогично. Только библиотеки для компиляции нужно брать у сервера приложений, который используется. Если я использую JBoss, то для компиляции сервлета мне нужно будет выполнить примерно следующее
Структура архива JavaEE-приложения должна соответствовать определенному формату. Например
Способы запуска приложения на самом сервере с помощью командной строки для каждого сервера различны.
Надеюсь, данная статья станет для кого-нибудь шпаргалкой для работы с Java в командной строке. Данные навыки помогут понять содержание и смысл Ant-скриптов и ответить на собеседовании на более каверзные вопросы, чем «Какая IDE Вам больше нравится?».
Создание структуры папок src / main / java в Eclipse без Maven
как создать src/main/java и src/test/java в моем проекте веб-приложения по умолчанию в Eclipse без Maven? Моя текущая структура папок
8 ответов
Я решил эту проблему, выполните следующие действия:
открыть Properties > Java Build Path для проекта. Выберите Source tab и использовать Add Folders для добавления исходных папок.
удалите фактическое определение исходной папки в пути сборки и добавьте новую исходную папку с именем it src/main/java
проблема будет решена путем проверки «JRE System Library» и «Maven Dependencies» checkboxs нажмите OK. это находится в «опции пути сборки» проекта
Если вы не найдете включенный путь, просто добавьте путь, который он разрешит.
Если структура пакета настроена как src.главная.java.com.inventica, вместо com.inventica, это обычно потому, что в разделе свойства проекта > Путь сборки Java > источник исходная папка настроена как «src» вместо «src/main/java». Нет простого способа исправить это, поэтому удалите » src » в качестве исходной папки и нажмите ok. Теперь eclipse покажет иерархию папок «src/main / java». Перейдите в папку «java» > щелкните правой кнопкой мыши > путь сборки > использовать в качестве исходной папки. После этого вам, возможно, придется исправить Затмение.проект и. файлы classpath, чтобы он использовал Maven для управления зависимостями, сборками и т. д. Как правило, вы можете скопировать это из рабочего проекта, так как здесь нет ничего конкретного проекта, предполагая, что вы структурированы как стандартный проект Maven.
простым решением было бы создать папку «java» непосредственно один диск в src/main даже до открытия его в eclipse, таким образом, eclipse не будет жаловаться на проблему.
Как в IntelliJ IDEA в проекте в директории src создать поддиректории?
Начинаю осваивать Java c IDE от JetBrains по видеоурокам.
В этом видео https://youtu.be/xvUFqDKIKJE?t=685 представлена структура папок в проекте src > main > java > Start.java
Я в IDEA создал Java проект и в нем была директория src «синяя». Я решил повторить структуру директорий как в видео и создать поддиректории в src, нажал ПКМ > New, но в выпадающем меню не было пункта для создания поддиректории.
Почему так и как это исправить?
Простой 1 комментарий
Прочитайте мой ответ, я ответил вам как создать пакет в Java.
Я нажал ПКМ на папке src, выбрал New > Package, но потом внутри этого пакета если я проделываю такую же последовательность действий, то пакет создается рядом, а не внутри.
Видимо, для создания вложенного пакета вместо выбора вновь созданного пакета вы кликаете на src.
Что означает синий цвет иконки папки у src?
Добрый день.
Прежде всего желаю вам успехов в изучении Java.
Как в IntelliJ IDEA в проекте в директории src создать поддиректории?
В Java мы оперируем не директориями, а пакетами (Package), хоть по сути пакеты и являются директориями.
What is the advantage of the ‘src/main/java» convention?
I’ve noticed that a lot of projects have the following structure:
I currently use the following convention (as my projects are 100% java):
I’m not currently using Maven but am wondering if this is a Maven convention or not or if there is another reason. Can someone explain why the first version is so popular these days and if I should adopt this new convention or not?
5 Answers 5
Main benefit is in having the test directory as subdirectory of src with the same directory structure as the one in main :
Yes, this is the Maven convention.
If you are happy with your current build system (whatever it is), there is no reason to switch to Maven. Otherwise, or if starting a new project, you could evaluate your options, including Maven.
Others have already told you it’s a Maven convention, I’m going to answer your question instead:
Absolutely none. Certainly it’s beneficial to separate pieces of code to separate root folders, but usually you could achieve the same with
instead. In fact here’s a big thing Maven does that’s actually hugely wrong: It wants to add binary content to source code repository which is meant for textual content only! All binary content should be managed outside the source code repository, that includes images in web applications and whatnot.
But OK, lets assume that you’ve decided to live in the somewhat smelly Maven ecosystem; then you should of course follow the Maven conventions as strictly as possible.







