0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Это базовая тема. Двигаться дальше, к следующему уроку, стоит только после вдумчивого понимания этой темы. Смелее задавайте вопросы в обсуждениях и не ленитесь читать уже заданные вопросы - возможно там уже есть для вас ответ или подсказка :)</p>
1
<p>Это базовая тема. Двигаться дальше, к следующему уроку, стоит только после вдумчивого понимания этой темы. Смелее задавайте вопросы в обсуждениях и не ленитесь читать уже заданные вопросы - возможно там уже есть для вас ответ или подсказка :)</p>
2
<h2>Что такое пакеты?</h2>
2
<h2>Что такое пакеты?</h2>
3
<p>Пакеты, по сути, являются файловой и логической структурой связей классов в мире java. Очень схоже с файловой системой компьютера. На уровне файловой системы пакеты это и есть папки, в которых лежат другие папки (подпакеты) и классы. Но пакеты не всегда описывают напрямую всю структуру проекта. На практике проект включает в себя различные ресурсы, а структура папок, которую мы назначаем как имена пакетов для наших классов - может быть лишь небольшой частью целого проекта. Ведь, кроме основного кода в пакетах, у нас должны быть еще и тесты, библиотеки или даже другие языки программирования в проекте в целом.</p>
3
<p>Пакеты, по сути, являются файловой и логической структурой связей классов в мире java. Очень схоже с файловой системой компьютера. На уровне файловой системы пакеты это и есть папки, в которых лежат другие папки (подпакеты) и классы. Но пакеты не всегда описывают напрямую всю структуру проекта. На практике проект включает в себя различные ресурсы, а структура папок, которую мы назначаем как имена пакетов для наших классов - может быть лишь небольшой частью целого проекта. Ведь, кроме основного кода в пакетах, у нас должны быть еще и тесты, библиотеки или даже другие языки программирования в проекте в целом.</p>
4
<p>Пакеты необходимы не только для красивого размещения файликов по папочкам или решения серьезной проблемы коллизии имен, но и для разделения доступа классов друг к другу. Именно благодаря пакетам мы можем через точку . получать доступ к нужным нам классам различных библиотек.</p>
4
<p>Пакеты необходимы не только для красивого размещения файликов по папочкам или решения серьезной проблемы коллизии имен, но и для разделения доступа классов друг к другу. Именно благодаря пакетам мы можем через точку . получать доступ к нужным нам классам различных библиотек.</p>
5
<p>Как аналогию, можно привести пример с адресами.</p>
5
<p>Как аналогию, можно привести пример с адресами.</p>
6
<p>Представим себя в роли некого класса, который выполняет некие функции для этого мира. Для того чтобы этот мир к нам обратился - нам нужно иметь конкретный адрес, путь по которому можно будет взаимодействовать с нами. Пускай это будет адрес, например:</p>
6
<p>Представим себя в роли некого класса, который выполняет некие функции для этого мира. Для того чтобы этот мир к нам обратился - нам нужно иметь конкретный адрес, путь по которому можно будет взаимодействовать с нами. Пускай это будет адрес, например:</p>
7
<p>package страна.область.город.район.улица.дом.имяЧеловека корневой_пакет.подпакет.подпакет.подпакет.имяКласса</p>
7
<p>package страна.область.город.район.улица.дом.имяЧеловека корневой_пакет.подпакет.подпакет.подпакет.имяКласса</p>
8
<h3>Что такое пакет для класса</h3>
8
<h3>Что такое пакет для класса</h3>
9
<p>Для класса его пакет - это его местоположение в проекте, относительно других классов. Благодаря разделению классов на несколько пакетов - мы организовываем структуру программы.</p>
9
<p>Для класса его пакет - это его местоположение в проекте, относительно других классов. Благодаря разделению классов на несколько пакетов - мы организовываем структуру программы.</p>
10
<p>Сильно забегая вперед скажу, что такое разделение нужно не только для красоты, но и для ограничения доступа к некоторым членам класса. Например:</p>
10
<p>Сильно забегая вперед скажу, что такое разделение нужно не только для красоты, но и для ограничения доступа к некоторым членам класса. Например:</p>
11
<ul><li>отсутствие модификатора перед методом или полем (еще говорят package-private) - означает, что данный член класса будет виден другим классам, но только из этого же пакета;</li>
11
<ul><li>отсутствие модификатора перед методом или полем (еще говорят package-private) - означает, что данный член класса будет виден другим классам, но только из этого же пакета;</li>
12
<li>protected перед методом или полем - означает, что данный член класса будет виден не только классам текущего пакета, как с package-private, но и классам-наследникам.</li>
12
<li>protected перед методом или полем - означает, что данный член класса будет виден не только классам текущего пакета, как с package-private, но и классам-наследникам.</li>
13
</ul><h2>Как создать класс внутри пакета?</h2>
13
</ul><h2>Как создать класс внутри пакета?</h2>
14
<p>По сути нам нужно:</p>
14
<p>По сути нам нужно:</p>
15
<ul><li>создать текстовый файл с расширением .java в нужной папке;</li>
15
<ul><li>создать текстовый файл с расширением .java в нужной папке;</li>
16
<li>в самом файле, помимо класса, написать имя его пакета.</li>
16
<li>в самом файле, помимо класса, написать имя его пакета.</li>
17
</ul><p>Рассмотрим этот процесс поэтапно.</p>
17
</ul><p>Рассмотрим этот процесс поэтапно.</p>
18
<p>Сначала пишем имя любимого редактора в терминале, потом существующий путь, а потом имя будущего текстового файла. Пример для редактора nano:</p>
18
<p>Сначала пишем имя любимого редактора в терминале, потом существующий путь, а потом имя будущего текстового файла. Пример для редактора nano:</p>
19
<p>UserName BASH ~/projectName/src nano -f /io/hexlet/xo/view/ConsoleView.java</p>
19
<p>UserName BASH ~/projectName/src nano -f /io/hexlet/xo/view/ConsoleView.java</p>
20
<p>Или с помощью sublime:</p>
20
<p>Или с помощью sublime:</p>
21
<p>UserName BASH ~/projectName/src subl /io/hexlet/xo/view/ConsoleView.java</p>
21
<p>UserName BASH ~/projectName/src subl /io/hexlet/xo/view/ConsoleView.java</p>
22
<p><em>Если команда subl не найдена и Вы уверены в том, что sublime установлен - проверьте, в переменных среды окружения, наличие прописанного пути к папке, в которой лежит subl.</em></p>
22
<p><em>Если команда subl не найдена и Вы уверены в том, что sublime установлен - проверьте, в переменных среды окружения, наличие прописанного пути к папке, в которой лежит subl.</em></p>
23
<p>Можно и обычным блокнотом создать нужный файл в нужной директории.<strong>Создать сам файл можно и любым другим удобным для вас способом.</strong></p>
23
<p>Можно и обычным блокнотом создать нужный файл в нужной директории.<strong>Создать сам файл можно и любым другим удобным для вас способом.</strong></p>
24
<p>Файл создан. Но класса в нем нет. Создадим класс:</p>
24
<p>Файл создан. Но класса в нем нет. Создадим класс:</p>
25
<p>Теперь у нас есть и файл в нужной папке, и класс в файле. Но сам класс ничего не знает про то, что он принадлежит некому пакету. Исправим это:</p>
25
<p>Теперь у нас есть и файл в нужной папке, и класс в файле. Но сам класс ничего не знает про то, что он принадлежит некому пакету. Исправим это:</p>
26
<p><em>Не забываем сохранять файл!</em></p>
26
<p><em>Не забываем сохранять файл!</em></p>
27
<p>Ключевые моменты верного создания класса внутри пакета:</p>
27
<p>Ключевые моменты верного создания класса внутри пакета:</p>
28
<ul><li>внутри класса должно использоваться ключевое слово package;</li>
28
<ul><li>внутри класса должно использоваться ключевое слово package;</li>
29
<li>ключевое слово package должно быть в первой строке кода, перед импортами и объявлением самого класса;</li>
29
<li>ключевое слово package должно быть в первой строке кода, перед импортами и объявлением самого класса;</li>
30
<li>после package нужно указать полное имя пакета, с корня пакета до пакета(папки) в которой размещен класс;</li>
30
<li>после package нужно указать полное имя пакета, с корня пакета до пакета(папки) в которой размещен класс;</li>
31
<li>каждая отдельная папка, в полном имени пакета, отделяется точкой;</li>
31
<li>каждая отдельная папка, в полном имени пакета, отделяется точкой;</li>
32
<li>имя самого класса не входит в имя объявляемого пакета;</li>
32
<li>имя самого класса не входит в имя объявляемого пакета;</li>
33
<li>реальное расположение файла и полное имя пакета, после слова package, - должны соответствовать друг другу.</li>
33
<li>реальное расположение файла и полное имя пакета, после слова package, - должны соответствовать друг другу.</li>
34
</ul><h2>Корень пакетов</h2>
34
</ul><h2>Корень пакетов</h2>
35
<p>А как же задать корневой каталог (папку) как основу пакетов, в котором уже и происходит ветвление этих всех под-пакетов (под-папок)? Почему, например, папка<strong><em>io</em></strong>является корнем для классов проекта, а папка<strong><em>src</em></strong>- не является пакетом, да и вообще не входит в пакетную структуру проекта?</p>
35
<p>А как же задать корневой каталог (папку) как основу пакетов, в котором уже и происходит ветвление этих всех под-пакетов (под-папок)? Почему, например, папка<strong><em>io</em></strong>является корнем для классов проекта, а папка<strong><em>src</em></strong>- не является пакетом, да и вообще не входит в пакетную структуру проекта?</p>
36
<p>Все очень просто: корневым пакетом считается тот который первым прописан в каждом java-файле после слова package, в текущем проекте. А в самом проекте помимо папки<strong><em>src</em></strong>, на ее уровне и выше, - могут быть много различных папок и файлов, для работы с проектом в целом. Но это не делает их корневым пакетом, или вообще частью пакетов java, в этом проекте, если они не включены в имена пакетов в классах, после ключевого слова package. Пример структуры папок и пакетов:</p>
36
<p>Все очень просто: корневым пакетом считается тот который первым прописан в каждом java-файле после слова package, в текущем проекте. А в самом проекте помимо папки<strong><em>src</em></strong>, на ее уровне и выше, - могут быть много различных папок и файлов, для работы с проектом в целом. Но это не делает их корневым пакетом, или вообще частью пакетов java, в этом проекте, если они не включены в имена пакетов в классах, после ключевого слова package. Пример структуры папок и пакетов:</p>
37
<p>-/projectName // Папка проекта. Может содержать кучу всякой всячины. README.md // файл с описанием. В пакет никак не входит, но входит в проект. +/out // Папка для скомпилированных файлов *.class -/src // Папка для исходных файлов *.java -/io // корень пакета StartClass.java // package io; -/hexlet OneMoreClass.java // package io.hexlet; -/xo // в этой папке может и не быть классов -/controllers ControllerOne.java // package io.hexlet.xo.controllers; Controller2.java // package io.hexlet.xo.controllers; -/model ModelClaas1.java // package io.hexlet.xo.model; ModelClass2.java // package io.hexlet.xo.model; -/view SomeView.java // package io.hexlet.xo.view;</p>
37
<p>-/projectName // Папка проекта. Может содержать кучу всякой всячины. README.md // файл с описанием. В пакет никак не входит, но входит в проект. +/out // Папка для скомпилированных файлов *.class -/src // Папка для исходных файлов *.java -/io // корень пакета StartClass.java // package io; -/hexlet OneMoreClass.java // package io.hexlet; -/xo // в этой папке может и не быть классов -/controllers ControllerOne.java // package io.hexlet.xo.controllers; Controller2.java // package io.hexlet.xo.controllers; -/model ModelClaas1.java // package io.hexlet.xo.model; ModelClass2.java // package io.hexlet.xo.model; -/view SomeView.java // package io.hexlet.xo.view;</p>
38
<p>Пример содержимого класса OneMoreClass.java:</p>
38
<p>Пример содержимого класса OneMoreClass.java:</p>
39
<p>Пример содержимого класса SomeView.java:</p>
39
<p>Пример содержимого класса SomeView.java:</p>
40
<p>Как видно из примеров выше - любой класс в этом проекте всегда содержит в имени пакета на первом месте папку<strong><em>io</em></strong>. Это и будет корневым пакетом проекта. На месте папки<strong><em>io</em></strong>могла быть папка<strong><em>com</em></strong>или любое другое имя. Важно чтобы все java-классы текущего проекта указывали на эту папку как на первую после ключевого слова package. Если хоть у одного класса в этом проекте папка<strong><em>io</em></strong>не будет прописана - то такой класс как бы и не в проекте, а просто мусор в папке.</p>
40
<p>Как видно из примеров выше - любой класс в этом проекте всегда содержит в имени пакета на первом месте папку<strong><em>io</em></strong>. Это и будет корневым пакетом проекта. На месте папки<strong><em>io</em></strong>могла быть папка<strong><em>com</em></strong>или любое другое имя. Важно чтобы все java-классы текущего проекта указывали на эту папку как на первую после ключевого слова package. Если хоть у одного класса в этом проекте папка<strong><em>io</em></strong>не будет прописана - то такой класс как бы и не в проекте, а просто мусор в папке.</p>
41
<h2>Имена пакетов</h2>
41
<h2>Имена пакетов</h2>
42
<ul><li>Имя состоит из одного слова (желательно).</li>
42
<ul><li>Имя состоит из одного слова (желательно).</li>
43
<li>Без заглавных букв (желательно).</li>
43
<li>Без заглавных букв (желательно).</li>
44
</ul><p>Например, package com.MySuperLongPackageName.view - плохая практика именования пакетов.</p>
44
</ul><p>Например, package com.MySuperLongPackageName.view - плохая практика именования пакетов.</p>
45
<p>Совокупность имен под-пакетов делает проект уникальным, не похожим на миллионы других. Даже если, в каждом проекте в мире, 100% будет класс Main.java - то они маловероятно пересекутся и помешают друг-другу. Но даже если пересекутся - это решаемо, рассмотрим это в дальнейших примерах.</p>
45
<p>Совокупность имен под-пакетов делает проект уникальным, не похожим на миллионы других. Даже если, в каждом проекте в мире, 100% будет класс Main.java - то они маловероятно пересекутся и помешают друг-другу. Но даже если пересекутся - это решаемо, рассмотрим это в дальнейших примерах.</p>
46
<h2>Применение пакетов</h2>
46
<h2>Применение пакетов</h2>
47
<p>Адреса (пакеты) классам, в нашем проекте, мы уже выдали. Они нужны для доступа классов друг к другу.</p>
47
<p>Адреса (пакеты) классам, в нашем проекте, мы уже выдали. Они нужны для доступа классов друг к другу.</p>
48
<p>Как уже было сказано выше - пакет можно сравнить с адресом. Рассмотрим это на примере ветвления папок(пакетов).</p>
48
<p>Как уже было сказано выше - пакет можно сравнить с адресом. Рассмотрим это на примере ветвления папок(пакетов).</p>
49
<p>Допустим, в классе StartClass.java нам нужно создать экземпляр класса SomeView.java, для использования его метода message(). Как это можно реализовать:</p>
49
<p>Допустим, в классе StartClass.java нам нужно создать экземпляр класса SomeView.java, для использования его метода message(). Как это можно реализовать:</p>
50
<p>Только благодаря прописанному пути к классу SomeView, класс StartClass может вообще узнать о его существовании.</p>
50
<p>Только благодаря прописанному пути к классу SomeView, класс StartClass может вообще узнать о его существовании.</p>
51
<p>Но прописывание таких длинных путей (io.hexlet.xo.view.SomeView) - просто не удобно. Поэтому, к нам на выручку, приходит<strong>импортирование</strong>.</p>
51
<p>Но прописывание таких длинных путей (io.hexlet.xo.view.SomeView) - просто не удобно. Поэтому, к нам на выручку, приходит<strong>импортирование</strong>.</p>
52
<h2>Импортирование пакетов</h2>
52
<h2>Импортирование пакетов</h2>
53
<p>Для того чтобы не писать длинные пути, к каждому конкретному классу, при каждом его использовании - нужно его импортировать. Для этого применяется ключевое слово import. Импорты пишутся между строчкой package ... и строчкой объявления класса. Перепишем предыдущий пример StartClass с применением ключевого слова import:</p>
53
<p>Для того чтобы не писать длинные пути, к каждому конкретному классу, при каждом его использовании - нужно его импортировать. Для этого применяется ключевое слово import. Импорты пишутся между строчкой package ... и строчкой объявления класса. Перепишем предыдущий пример StartClass с применением ключевого слова import:</p>
54
<p>Если в пакете io.hexlet.xo.view очень много разных классов. И они нам все нужны тут, в классе StartClass, как их все разом заимпортировать?</p>
54
<p>Если в пакете io.hexlet.xo.view очень много разных классов. И они нам все нужны тут, в классе StartClass, как их все разом заимпортировать?</p>
55
<p>Решение приходит со звездочкой *.</p>
55
<p>Решение приходит со звездочкой *.</p>
56
<p>Перепишем предыдущий пример с импортированием любых классов из пакета io.hexlet.xo.view:</p>
56
<p>Перепишем предыдущий пример с импортированием любых классов из пакета io.hexlet.xo.view:</p>
57
<p>В случае возникновения коллизий имен классов, например, когда в разных пакетах есть классы с одинаковыми именами и оба пакета импортированы - тогда придется обращаться к таким классам с использованием полных имени пакетов. Например, io.hexlet.xo.view.SomeView. Иначе java не будет знать из какого именно пакета использовать класс, в данном случае.</p>
57
<p>В случае возникновения коллизий имен классов, например, когда в разных пакетах есть классы с одинаковыми именами и оба пакета импортированы - тогда придется обращаться к таким классам с использованием полных имени пакетов. Например, io.hexlet.xo.view.SomeView. Иначе java не будет знать из какого именно пакета использовать класс, в данном случае.</p>
58
<h2>Импортирование по умолчанию</h2>
58
<h2>Импортирование по умолчанию</h2>
59
<p>Независимо от того, написал ли программист вообще слово import, перед определением своего класса - java всегда автоматически, неявно, импортирует в текущий класс два пакета:</p>
59
<p>Независимо от того, написал ли программист вообще слово import, перед определением своего класса - java всегда автоматически, неявно, импортирует в текущий класс два пакета:</p>
60
<ol><li>java.lang.*;. Вручную в коде это можно прописать так: import java.lang.*;. Это одна из стандартных библиотек java.</li>
60
<ol><li>java.lang.*;. Вручную в коде это можно прописать так: import java.lang.*;. Это одна из стандартных библиотек java.</li>
61
<li>Текущий пакет, в котором находится текущий класс. Вручную это выглядело бы так: import . или import полный.путь.к.папке.с.этим.файлом.</li>
61
<li>Текущий пакет, в котором находится текущий класс. Вручную это выглядело бы так: import . или import полный.путь.к.папке.с.этим.файлом.</li>
62
</ol><p>Обратите внимание на строку System.out.println("Some very important message!"); в классе SomeView:</p>
62
</ol><p>Обратите внимание на строку System.out.println("Some very important message!"); в классе SomeView:</p>
63
<p>Класс SomeView видит класс System и его открытые поля, в частности поле out, благодаря стандартному импорту java.lang.*;, т.к. System входит в пакет java.lang.</p>
63
<p>Класс SomeView видит класс System и его открытые поля, в частности поле out, благодаря стандартному импорту java.lang.*;, т.к. System входит в пакет java.lang.</p>
64
<h2>Статическое импортирование</h2>
64
<h2>Статическое импортирование</h2>
65
<p>Этот аспект будет рассмотрен в "Модуль 3. Урок 3. Уровни методов в Java." Поскольку там мы лучше познакомимся с ключевым словом static.</p>
65
<p>Этот аспект будет рассмотрен в "Модуль 3. Урок 3. Уровни методов в Java." Поскольку там мы лучше познакомимся с ключевым словом static.</p>
66
<h2>Как компилировать классы в пакетах</h2>
66
<h2>Как компилировать классы в пакетах</h2>
67
<p><em><strong>Для компиляции, используется команда javac.</strong></em></p>
67
<p><em><strong>Для компиляции, используется команда javac.</strong></em></p>
68
<p>Для компиляции отдельного файла в конкретном пакете, нужно прописать команду так: javac src/com/package_name/package_name/ClassName.java. Обратите внимание, что для команды javac - мы прописываем все пути через слеш (/), а не через точки. И обязательно нужно указать расширение файлов (.java).</p>
68
<p>Для компиляции отдельного файла в конкретном пакете, нужно прописать команду так: javac src/com/package_name/package_name/ClassName.java. Обратите внимание, что для команды javac - мы прописываем все пути через слеш (/), а не через точки. И обязательно нужно указать расширение файлов (.java).</p>
69
<p>Если этот файл (класс) ClassName.java использует в своем коде другой класс, из соседнего пакета - это уже зависимость. Нужно подсказать компилятору, где еще лежат исходники (сорцы), от которых может зависеть компилируемый класс, с помощью ключа -sourcepath. Выглядит это так: javac -sourcepath src. А потом уже пишем путь к компилируемому файлу: src/com/package_name/package_name/ClassName.java. Целиком, в терминале, команда будет выглядеть так: javac -sourcepath src src/com/package_name/package_name/ClassName.java. -sourcepath src можно написать и в конце данной строки.</p>
69
<p>Если этот файл (класс) ClassName.java использует в своем коде другой класс, из соседнего пакета - это уже зависимость. Нужно подсказать компилятору, где еще лежат исходники (сорцы), от которых может зависеть компилируемый класс, с помощью ключа -sourcepath. Выглядит это так: javac -sourcepath src. А потом уже пишем путь к компилируемому файлу: src/com/package_name/package_name/ClassName.java. Целиком, в терминале, команда будет выглядеть так: javac -sourcepath src src/com/package_name/package_name/ClassName.java. -sourcepath src можно написать и в конце данной строки.</p>
70
<p>Для того чтобы класс-файлы не лежали рядом с исходниками, а в отдельной папочке, можно применить ключ -d, а за ним имя существующей папки, в которую складываются скомпилированные классы. Переделаем предыдущий пример так: javac src/com/package_name/package_name/ClassName.java -sourcepath src -d out.</p>
70
<p>Для того чтобы класс-файлы не лежали рядом с исходниками, а в отдельной папочке, можно применить ключ -d, а за ним имя существующей папки, в которую складываются скомпилированные классы. Переделаем предыдущий пример так: javac src/com/package_name/package_name/ClassName.java -sourcepath src -d out.</p>
71
<p>Для того, чтобы компилятор прошелся по всем директориям в папке, например, src и скомпилировал там все исходники - нужно ввести команду так: javac src/**/*.java (пройтись по всем под папкам в папке src и скомпилировать там все файлы *.java). Правда они опять будут лежать радом с исходниками. Лучше сразу разложить класс-файлы в отдельную папку: javac src/**/*.java -d out. Все скомпилированные классы будут разложены по пакетам так же как они располагались в папке src.</p>
71
<p>Для того, чтобы компилятор прошелся по всем директориям в папке, например, src и скомпилировал там все исходники - нужно ввести команду так: javac src/**/*.java (пройтись по всем под папкам в папке src и скомпилировать там все файлы *.java). Правда они опять будут лежать радом с исходниками. Лучше сразу разложить класс-файлы в отдельную папку: javac src/**/*.java -d out. Все скомпилированные классы будут разложены по пакетам так же как они располагались в папке src.</p>
72
<p>А если эти классы в папке src зависят друг от друга, то команда будет выглядеть так: javac src/**/*.java -d out -sourcepath src. В результате чего компилятор скомпилирует все *.java-файлы в *.class-файлы, свяжет их по зависимостям и уложит в директорию out.</p>
72
<p>А если эти классы в папке src зависят друг от друга, то команда будет выглядеть так: javac src/**/*.java -d out -sourcepath src. В результате чего компилятор скомпилирует все *.java-файлы в *.class-файлы, свяжет их по зависимостям и уложит в директорию out.</p>
73
<blockquote><p>Некоторые терминалы не понимают звездочки **. Например, команда javac src/**/*.java может просто выдавать ошибку отсутствия файлов. "Понимание звездочек" нужно включать! В bash это можно включить командой: shopt -s globstar.</p>
73
<blockquote><p>Некоторые терминалы не понимают звездочки **. Например, команда javac src/**/*.java может просто выдавать ошибку отсутствия файлов. "Понимание звездочек" нужно включать! В bash это можно включить командой: shopt -s globstar.</p>
74
</blockquote><h2>Как запускать классы в пакетах</h2>
74
</blockquote><h2>Как запускать классы в пакетах</h2>
75
<p><em><strong>Для запуска java-приложений используется командаjava.</strong></em></p>
75
<p><em><strong>Для запуска java-приложений используется командаjava.</strong></em></p>
76
<p>Для запуска отдельных классов, которые не в пакетах, используется простой подход, например: java Main, java Start, java MyStartClass. Главное, чтобы в этом классе был специальный метод:</p>
76
<p>Для запуска отдельных классов, которые не в пакетах, используется простой подход, например: java Main, java Start, java MyStartClass. Главное, чтобы в этом классе был специальный метод:</p>
77
<p>Именно с него начинается работа самостоятельной java-программы. В остальных классах одной программы - этот метод не нужен.</p>
77
<p>Именно с него начинается работа самостоятельной java-программы. В остальных классах одной программы - этот метод не нужен.</p>
78
<p>А для запуска "пакетного" класса на исполнение требуется иной подход.</p>
78
<p>А для запуска "пакетного" класса на исполнение требуется иной подход.</p>
79
<p><strong>Запустим наш класс StartClass.</strong></p>
79
<p><strong>Запустим наш класс StartClass.</strong></p>
80
<p>Поскольку наш исполняемый файл StartClass.class лежит в отдельной папочке и в своей некой ветке директорий (пакете), то теперь нужно не просто написать java StartClass, а указать:</p>
80
<p>Поскольку наш исполняемый файл StartClass.class лежит в отдельной папочке и в своей некой ветке директорий (пакете), то теперь нужно не просто написать java StartClass, а указать:</p>
81
<ul><li>classpath (путь к папке со всеми пакетами и скомпилированными классами в них);</li>
81
<ul><li>classpath (путь к папке со всеми пакетами и скомпилированными классами в них);</li>
82
<li>путь к стартовому классу в пакетной структуре этого класса.</li>
82
<li>путь к стартовому классу в пакетной структуре этого класса.</li>
83
</ul><p>-classpath, сокращенно: -cp. После этого ключа нужно указать имя папки, в которой лежат пакеты содержащие скомпилированные классы, в нашем случае это out.</p>
83
</ul><p>-classpath, сокращенно: -cp. После этого ключа нужно указать имя папки, в которой лежат пакеты содержащие скомпилированные классы, в нашем случае это out.</p>
84
<p>Путь к стартовому классу, в пакетной структуре программы, нужно прописывать через точку: io.StartClass.</p>
84
<p>Путь к стартовому классу, в пакетной структуре программы, нужно прописывать через точку: io.StartClass.</p>
85
<p>Команда запуска StartClass.class в одну строчку будет выглядеть так: java -cp ./out io.StartClass.</p>
85
<p>Команда запуска StartClass.class в одну строчку будет выглядеть так: java -cp ./out io.StartClass.</p>
86
<p>Обратите внимание:</p>
86
<p>Обратите внимание:</p>
87
<ul><li>В данной команде ключ пути к классам (-cp) должен идти первым, а потом уже путь и имя запускаемого класса.</li>
87
<ul><li>В данной команде ключ пути к классам (-cp) должен идти первым, а потом уже путь и имя запускаемого класса.</li>
88
<li>И имя класса должно быть без расширения .class (в отличие от javac)!</li>
88
<li>И имя класса должно быть без расширения .class (в отличие от javac)!</li>
89
<li>Для запуска программы нужно указывать только тот класс, который содержит main-метод, остальные зависимости будут найдены и подключены из папки out автоматически, благодаря ключу -cp.</li>
89
<li>Для запуска программы нужно указывать только тот класс, который содержит main-метод, остальные зависимости будут найдены и подключены из папки out автоматически, благодаря ключу -cp.</li>
90
</ul><p><strong>Полезные ссылки:</strong></p>
90
</ul><p><strong>Полезные ссылки:</strong></p>
91
<ul><li>Правильная инсталляция JDK и<a>настройка переменных окружающей среды</a>. Чтобы работала команда javac</li>
91
<ul><li>Правильная инсталляция JDK и<a>настройка переменных окружающей среды</a>. Чтобы работала команда javac</li>
92
<li>Не проходит команда со звездочками javac src/**/*.java? Решение:<ul><li><a>MacOS</a>.</li>
92
<li>Не проходит команда со звездочками javac src/**/*.java? Решение:<ul><li><a>MacOS</a>.</li>
93
<li><a>Windows</a>.</li>
93
<li><a>Windows</a>.</li>
94
</ul></li>
94
</ul></li>
95
</ul><h2>Документация</h2>
95
</ul><h2>Документация</h2>
96
<ul><li><a>Что такое пакеты, иерархия, создание, использование, импортирование - Oracle</a></li>
96
<ul><li><a>Что такое пакеты, иерархия, создание, использование, импортирование - Oracle</a></li>
97
<li><a>Что такое пакеты, иерархия, создание, использование, импортирование - Tutorialspoint</a></li>
97
<li><a>Что такое пакеты, иерархия, создание, использование, импортирование - Tutorialspoint</a></li>
98
</ul>
98
</ul>