JavaRush /Курсы /JAVA 25 SELF /Структура Java-проекта: src, package, classpath

Структура Java-проекта: src, package, classpath

JAVA 25 SELF
5 уровень , 4 лекция
Открыта

1. Папка src — где живёт ваш код

Если бы Java-проект был домом, то папка src — это уютная гостиная, где собираются все основные обитатели (ваши классы). Именно сюда помещаются все исходные файлы с кодом, а не в корень проекта, не в папку с настройками и не на рабочий стол (даже если очень хочется).

Почему отделять исходники от всего остального?

  • В папке src хранятся только файлы, которые вы пишете руками: .java.
  • Всё, что появляется в процессе сборки (например, .class-файлы, временные файлы), складывается в другие папки (out, build, target и т.д.).
  • Это облегчает навигацию, делает проект чище, а IDE — счастливее.

Пример структуры простого проекта:

MyFirstProject/
├── .idea/           # служебные файлы IntelliJ IDEA, не трогаем
├── out/             # тут появляются скомпилированные .class-файлы
├── src/             # вот тут живёт ваш исходный код!
│   └── Main.java
├── MyFirstProject.iml
└── README.md

Важно:
Всё, что вы пишете сами — классы, пакеты, интерфейсы — должно быть в папке src. Не кладите туда картинки, музыку и секретные рецепты — для этого есть другие папки.

2. Пакеты package

В Java принято группировать классы по "пакетам" — это как папки в файловой системе, только для классов. Пакеты помогают:

  • Избежать конфликтов имён, если в проекте два класса Main — в разных пакетах они не будут мешать друг другу.
  • Логически структурировать код (например, com.javarush.tasks, com.mycompany.utils).
  • Управлять доступом к классам и методам.

Синтаксис объявления пакета

В начале каждого Java-файла (до всех import и class) пишется строка:

package com.javarush.lesson05;

Это значит: класс из этого файла принадлежит пакету com.javarush.lesson05.

Важно:
Папки в файловой системе должны совпадать с именем пакета! Если у вас написано package com.javarush.lesson05;, то путь к файлу будет:

src/com/javarush/lesson05/Main.java

Как создать пакет в IntelliJ IDEA

  1. В панели проекта кликните правой кнопкой мыши по папке src.
  2. Выберите New → Package.
  3. Введите имя, например: com.javarush.lesson05 (IDE сама создаст вложенные папки).
  4. Теперь создайте новый класс внутри этого пакета. Кликните правой кнопкой мыши по папке com.javarush.lesson05 и выбирите New → Java Class. И введите имя

Пример:

src/
└── com/
    └── javarush/
        └── lesson05/
            └── User.java

Почему нельзя просто всё складывать в src?

Если положить все классы вперемешку, проект быстро превратится в "свалку", где найти нужный файл будет сложнее, чем найти зарядку для ноутбука в студенческом общежитии. Используйте пакеты — так будет проще масштабировать проект, подключать сторонние библиотеки и делить код между разными командами.

3. Полное имя класса

Каждый класс в Java обязательно находится в каком-то пакете. Пакет — это просто "папка" внутри библиотеки классов. Например:

  • Класс System лежит в пакете java.lang. Его полное имя — java.lang.System.
  • Класс Scanner лежит в пакете java.util. Его полное имя — java.util.Scanner.
  • Класс ArrayList тоже в java.util, поэтому полное имя — java.util.ArrayList.

То есть полное имя класса = имя пакета + точка + имя класса.

Попробуем использовать это в коде:

java.util.Scanner sc = new java.util.Scanner(System.in);
String name = sc.nextLine();
System.out.println("Привет, " + name);

Здесь мы явно пишем java.util.Scanner. Компилятор понимает, о каком именно классе идёт речь, даже если в программе есть другие классы с именем Scanner.

Это очень важно: имя класса может совпадать, но полное имя всегда уникально.

Зачем вообще нужно полное имя?

Представьте, что у нас есть два разных класса Date:

  • java.util.Date (старый класс для работы с датами),
  • java.sql.Date (дата для работы с базами данных).

Если вы просто напишете:

Date d = new Date();

Компилятор не поймёт, какой именно Date вы хотите использовать. Но если написать полное имя:

java.util.Date d1 = new java.util.Date();
java.sql.Date d2 = new java.sql.Date(System.currentTimeMillis());

— путаницы не будет.

4. Оператор import

Писать каждый раз полное имя класса неудобно. Именно для этого в Java существует оператор import.

Если мы пишем:

import java.util.Scanner;

Это значит: "В этой программе я буду использовать класс Scanner из пакета java.util". После этого мы можем писать просто:

Scanner sc = new Scanner(System.in);

и компилятор поймёт, что речь идёт именно о java.util.Scanner.

Обычный import (один класс)

Это самый распространённый вариант. Мы указываем конкретный класс:

import java.util.Scanner;
import java.util.ArrayList;

Теперь можно писать короткие имена: Scanner, ArrayList.

Импорт всего пакета *

Иногда в программе используется много классов из одного пакета. Тогда можно написать:

import java.util.*;

Это значит: "Разрешить использовать все классы из пакета java.util без полного имени".

Теперь можно писать:

Scanner sc = new Scanner(System.in);
ArrayList<String> list = new ArrayList<>();

Но важно помнить: import java.util.*; импортирует только классы из пакета java.util, но не из подпакетов. Например, класс java.util.concurrent.ConcurrentHashMap сюда не попадёт. Его нужно импортировать отдельно.

Что нельзя сделать с import

  • import нельзя использовать внутри метода — он пишется только в начале файла.
  • import не загружает классы в память. Он только говорит компилятору, откуда брать класс.
  • import не может заменить полное имя, если есть два одинаковых класса.

5. Classpath — как Java ищет ваши классы

Classpath — это "маршрут", по которому Java ищет ваши классы, когда запускает программу. Можно представить это как список папок, где Java будет искать нужные .class-файлы (скомпилированные версии ваших .java).

По умолчанию IDE сама добавляет папку src (или папку скомпилированных классов, например, out/production/ProjectName) в classpath. То есть, если вы написали класс в пакете com.javarush.lesson05, Java будет искать его по пути:

out/production/ProjectName/com/javarush/lesson05/Main.class

Как работает classpath в IntelliJ IDEA?

  • Когда вы запускаете программу через IDE, она автоматически подставляет нужный classpath.
  • Если вы запускаете программу из командной строки, вам нужно явно указать classpath с помощью флага -cp или -classpath.
  • Все классы из вашего проекта и подключённых библиотек должны находиться в папках, которые указаны в classpath.

6. Организация кода в проекте

Один класс — один файл

В Java принято, чтобы каждый public-класс был в отдельном файле, который называется так же, как и сам класс. Например, если у вас класс Person, то файл должен называться Person.java.

Пример:

src/com/javarush/lesson05/Person.java
package com.javarush.lesson05;

public class Person {
    String name;
}

Имена файлов и классов должны совпадать

Если класс называется MySuperClass, то файл должен быть MySuperClass.java. Это не просто прихоть, а требование компилятора Java. Если перепутать — получите ошибку на этапе компиляции.

Где хранить ресурсы (картинки, текстовые файлы)?

  • Для ресурсов обычно создают отдельную папку, например, resources или res.
  • В IntelliJ IDEA можно добавить такую папку через правый клик по папке: Mark Directory as → Resources Root.
  • Java-код может обращаться к этим файлам через classpath.

Пример структуры:

MyFirstProject/
├── src/
│   └── com/javarush/lesson05/
│       └── Main.java
├── resources/
│   └── config.txt

8. Типичные ошибки при работе со структурой проекта

Несовпадение структуры папок и пакета
Если в начале файла написано package com.javarush.lesson05;, а файл лежит в src/Main.java, компилятор выдаст ошибку "package does not exist" или "class not found". Всегда следите, чтобы папки соответствовали имени пакета!

Несовпадение имени файла и класса
Если класс называется Person, а файл — People.java, получите "class Person is public, should be declared in a file named Person.java".

Ручное перемещение файлов без обновления пакета
Если вы переместили файл в другую папку, но забыли поменять строку package, программа не скомпилируется. Делайте это в окне Project в IDE — она сама обновит package!

Ресурсы не добавлены в classpath
Если вы храните файлы (например, текстовые) вне папки resources и не пометили папку как Resources Root, программа не сможет их найти через classpath.

1
Задача
JAVA 25 SELF, 5 уровень, 4 лекция
Недоступна
Магическая куча камней 🤖🧑
Магическая куча камней 🤖🧑
1
Задача
JAVA 25 SELF, 5 уровень, 4 лекция
Недоступна
Битва с Двухголовым Драконом 🐉⚔️
Битва с Двухголовым Драконом 🐉⚔️
1
Задача
JAVA 25 SELF, 5 уровень, 4 лекция
Недоступна
Использование инструмента по полному адресу 🛠️
Использование инструмента по полному адресу 🛠️
1
Задача
JAVA 25 SELF, 5 уровень, 4 лекция
Недоступна
Учёт двух календарных систем: Время из разных измерений ⏳
Учёт двух календарных систем: Время из разных измерений ⏳
Комментарии (9)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Isa Уровень 1
5 декабря 2025
Собрал для вас горячие клавиши, которые могут облегчить вашу работу в Intellij Idea. psvm + Tab - Создаст статический main метод; Ctrl + D - Дублирование всей строки кода; Ctrl + / - Закомментировать / расскомментировать строку; Ctrl + W - Поэлементное выделение; Ctrl + Alt + O - Удалить неиспользуемые импорты; Ctrl + Alt + L - Форматирование кода; Ctrl + Alt + I - Форматирование строк для кривого кода (выравнивает количество пробелов); Ctrl + X - Вырезание одной строки кода; Ctrl + Y - Удаление одной строки кода; Ctrl + G - Навигация по строкам; Ctrl + Tab - Навигация по окнам; Ctrl + N - Навигация по элементам; Ctrl + L - Выровнивание кода по шаблону; Ctrl + T - Меню с обёртками; Ctrl + J - Меню с перечнем быстрых команд; Ctrl + F - Поиск в текущем открытом коде; Ctrl + Shift + F - Поиск во всем проекте; Ctrl + Shift + ENTER - Завершает строку, ставит ";" переходит на новую; Ctrl + ← / → - Переход по словам влево / вправо (а не по символам); Ctrl + Shift + ↓ / ↑ - Перемещение строки кода вниз / вверх; Ctrl + Delete - Удалить слово после курсора; Ctrl + Backspace Удалить слово перед курсором; Ctrl + Shift + F10 Выполнить текущую программу (а не искать какую именно в списке нужно выполнить, когда у тебя список из: test, test(1), test(2), main и т.д.); Shift + F6 - Переименовать что-то во всем коде (выделяешь переменную или метод, вводишь новое имя и IDEA исправляет ВЕЗДЕ по проекту это название на новое); Shift + Alt + Левый клик мыши - Многокурсорное редактирование; Alt + ← / → - Переход по классам между вкладками; Alt + 1 - Быстрый вызов дерева / каталога файлов проекта; Также рекомендую установить плагин Rainbow Brackets, будет красиво подсвечивать вам скобки и вам станет легче ориентироваться в коде (Соответствующие горячие клавиши для macOS/Linux вы можете узнать, отправив вышеуказанные комбинации любой нейронке и попросив эквиваленты для вашей ОС)
Александр Уровень 8
22 октября 2025
Не понимаю в чем логика если ярешил все верно и по условию но программе не приняла большую часть условий как верные. int knightHp = 100; int dragonHp = 50; Random rand = new Random(); int dragonMax = rand.nextInt(19) + 2; System.out.println("Максимальный разрешенный удар по дракону" + dragonMax); Scanner console = new Scanner(System.in); System.out.println("Битва началась! У рыцаря 100 жизней, у дракона 50 жизней."); while (true) { int dragon1 = rand.nextInt(10) + 1; int dragon2 = rand.nextInt(10) + 1; knightHp = knightHp - (dragon1 + dragon2); System.out.println("Жизни Рыцаря: " + knightHp); if (knightHp <= 0 ) { System.out.println("Дракон победил!"); break; } int khight = console.nextInt(); if( 0 < khight && khight < 21); else { while(true) { khight = console.nextInt(); if( 0 < khight && khight < 21) break; } } if(khight <= dragonMax) { dragonHp = dragonHp - khight; System.out.println("Жизни дракона: " + dragonHp); if (dragonHp <= 0) { System.out.println("Рыцарь победил! "); break; } }
Praeclurus Aeternitas Уровень 6
23 октября 2025
Общая логика может и верная, но задание душнее сверх всякой логики и меры. Поэтому попробуй написать ещё раз, прям точно следуя условию и порядку задач. Я прошел только с 13 попытки, хотя ещё на первой программа прекрасно работала (даже лучше, чем после 13 попытки). Если всё ещё сложно, то загляни в обсуждение задачи, я там оставил подсказки. И ещё, лучше писать вопросы по задачам в обсуждении задачи, а не всей лекции. А код красивее, когда оформляешь его с помощью </> вверху редактора сообщений :) Удачи!
Серега Батенин Уровень 12
28 сентября 2025
В игре с камнями при победе игрока добавьте вывод сообщения, что "Игрок победил!" иначе не засчитают
Anton Уровень 6
21 сентября 2025
Задачки топовые, только последняя задача про календари не понравилась.
D0min0D Уровень 39
3 сентября 2025
Не дает сдать решение задачи поскольку: "Ты сегодня отлично потрудился, пора сделать паузу. Возвращайся к решению задач завтра." Брат, да я их и не решал. Просто хотел догнать по материалу предыдущий курс...
Александр Уровень 33
1 октября 2025
Тут такой вопрос нарисовался. Каким образом в Идее стянуть правильное решение не используя CopyPaste?
Anonymous #3656771 Уровень 18
11 октября 2025
Просто машина переживает за тебя, ей то отдых не нужен, а тебе - необходим, мешок с костями:-))
D0min0D Уровень 39
14 октября 2025
Я использую копи паст, но наверное правильно использовать плагин JavaRush. На первых темах про него писали