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

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)
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ
Grimnir Рівень 20
4 листопада 2025
Перші 2 задачки класні вийшли, можна пошпілити (перекреслено) потестити))