HTML Diff
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>