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

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

Открыта

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

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

Несовпадение структуры папок и пакета
Если в начале файла написано 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 лекция
Недоступна
Учёт двух календарных систем: Время из разных измерений ⏳
Учёт двух календарных систем: Время из разных измерений ⏳
Комментарии (18)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Yerlik
Уровень 27
7 мая, 04:43
достали со своими драконами...
Ivan Sidorenko
Уровень 16
25 марта, 11:37
Кажется, у вас ошибка в пункте "Где хранить ресурсы (картинки, текстовые файлы)?" -> Пример структуры. Папка resources обычно находится внутри src, а не на одном уровне с ней.
Bohdan
Уровень 13
24 февраля, 21:01
Я не могу понять, весь этот квест, это один большой рофл или что?
Кэрривайт
Уровень 18
15 февраля, 05:43
Может кому-нибудь пригодится инфа: на рутубе есть ролик - Английский для айтишников. Программирование. Технический английский. Слушай и запоминай.
SB
Уровень 115
17 марта, 20:57
ссылку в студию! )
Андрей
Уровень 35
12 февраля, 08:46
В первой задаче проверка зачем-то просила реализовать контроль того, что вводится целое число? Компилятор и так выдает ошибку, если вести не целое число в операторе cs.nextInt();
Vany_int64
Уровень 112
4 февраля, 16:34
используйте анализ кода, даже если решили задачу правильно, ведь если вы не особо знакомы с прогой, то он очень полезен, я даже удивлен
Mench
Уровень 9
3 января, 10:30
Почему нельзя написать, int dragonMax = rand.nextInt(21); ? вместо (19) + 2;
Anonymous #6452546
Уровень 20
10 января, 15:09
Метод работает не так, как вы себе представляете. rand.nextInt(A) + B; (что скрывается за числами A и B? A - диапазон в котором числа будут принимать псевдорандомные значения от 0 до A-1 (значение A при этом не входит); B - смещение диапазона (от 0 до A-1) -> (от B до A+B-1); По условию задачи урон должен быть от 2 до 20 => мы знаем уже о смещение +2 и максимальное значение при этом 20 => B = +2; A = 20 - B + 1 = 19;
KEN Software Developer
29 марта, 16:35
Потому что, если ты ему указываешь 21, то у тебя будут выходить числа от 0 до 20, в целом получается 21 число, считая ноль. Для того что бы ноль убрать, ты делаешь +2, и пишешь ему 19, тогда получается если тебе рандомно попадется 0, 0 + 2 = 2, а если 19, то 19 + 2 = 21, что полностью соответствует условиям задачи!
Александр
Уровень 8
22 октября 2025, 11:40
Не понимаю в чем логика если ярешил все верно и по условию но программе не приняла большую часть условий как верные. 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 AeternitasSoftware Developer в BDPB
23 октября 2025, 23:21
Общая логика может и верная, но задание душнее сверх всякой логики и меры. Поэтому попробуй написать ещё раз, прям точно следуя условию и порядку задач. Я прошел только с 13 попытки, хотя ещё на первой программа прекрасно работала (даже лучше, чем после 13 попытки). Если всё ещё сложно, то загляни в обсуждение задачи, я там оставил подсказки. И ещё, лучше писать вопросы по задачам в обсуждении задачи, а не всей лекции. А код красивее, когда оформляешь его с помощью </> вверху редактора сообщений :) Удачи!
28 сентября 2025, 08:11
В игре с камнями при победе игрока добавьте вывод сообщения, что "Игрок победил!" иначе не засчитают
Anton System Engineer
21 сентября 2025, 07:16
Задачки топовые, только последняя задача про календари не понравилась.