JavaRush /Курсы /Kotlin SELF /Структура Kotlin-проекта: src, package, импорты и classpa...

Структура Kotlin-проекта: src, package, импорты и classpath

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

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

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

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

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

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

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

2. Пакеты package

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

  • Избежать конфликтов имён. Если в проекте две разные функции calculate(), но они лежат в разных пакетах — они не будут мешать друг другу.
  • Логически структурировать код. Например, com.kotlin.lesson05, com.kotlin.utils.

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

На самой первой строке каждого Kotlin-файла пишется:

package com.kotlin.lesson05

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

Важное правило хорошего тона:
В отличие от Java, компилятор Kotlin позволяет положить файл с пакетом com.kotlin прямо в корень папки src. Но делать так категорически не рекомендуется! Официальный стиль Kotlin Style Guide требует, чтобы структура папок на диске строго совпадала с именем пакета. То есть путь к файлу должен быть таким:

src/com/kotlin/lesson05/Main.kt

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

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

Пример:

src/
└── com/
    └── kotlin/
        └── lesson05/
            └── Utils.kt

Обратите внимание на путь к вашему файлу в панели снизу. Помните, при создании проекта мы поставили галочку Use compact project structure? Вот как она работает.

Если убрать компактный режим, то будут пустые папки.

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

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

3. Полное имя

Каждая функция или инструмент из стандартной библиотеки Kotlin тоже находится в своём пакете. Например:

  • Математическая функция для поиска максимума max() лежит в пакете kotlin.math. Её полное имя — kotlin.math.max.
  • Генератор случайных чисел Random лежит в kotlin.random. Полное имя — kotlin.random.Random.

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

Попробуем использовать это в коде, чтобы найти максимальное из двух чисел:

fun main() {
    val a = 10
    val b = 20
    val maximum = kotlin.math.max(a, b)
    println("Maximum number: $maximum")
}

Здесь мы явно пишем kotlin.math.max. Компилятор точно понимает, какую именно функцию мы вызываем.

4. Оператор import

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

Если мы пишем в самом верху файла, сразу под package:

import kotlin.math.max

Это значит: "В этой программе я буду использовать функцию max из пакета kotlin.math". После этого мы можем писать коротко и красиво:

val maximum = max(10, 20)

Обычный import

Мы указываем конкретный инструмент, который хотим использовать:

import kotlin.math.max
import kotlin.random.Random

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

Иногда нам нужно сразу много математических функций. Тогда можно написать звёздочку:

import kotlin.math.*

Это значит: "Разрешить использовать ВСЁ из пакета kotlin.math без полного имени".

Default Imports

Вы наверняка задались вопросом: "Подождите, но мы ведь уже пользовались println(), readln() и типом String без всяких импортов! Как это работало?"

Дело в том, что язык Kotlin заботится о вас. В каждый ваш файл он "невидимо" добавляет так называемые базовые импорты. Пакеты kotlin.*, kotlin.io.* где живут функции ввода-вывода, kotlin.collections.* импортируются по умолчанию. Поэтому самые частые команды доступны вам сразу "из коробки".

5. Classpath — как JVM ищет ваш код

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

По умолчанию IntelliJ IDEA всё делает за вас. Она сама добавляет папку со скомпилированным кодом, например, out/production/ProjectName в classpath. То есть, если вы написали код в пакете com.kotlin.lesson05, IDEA сама объяснит виртуальной машине, где его найти.

Вам пока не нужно настраивать его вручную, но если вы увидите в консоли странную ошибку вроде "ClassNotFoundException" — знайте, проблема где-то в путях сборки.

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

В Kotlin нет правила «Один класс = один файл»

Если вы когда-нибудь слышали о Java, то знаете её жесткое правило: имя публичного класса обязано совпадать с именем файла. В Kotlin программировать гораздо удобнее: в одном файле может находиться сколько угодно функций или классов.

Главное правило Kotlin — логическая группировка. Если у вас есть функции для математики, положите их в файл MathUtils.kt.

src/com/kotlin/lesson05/MathUtils.kt
package com.kotlin.lesson05

fun calculateSum(a: Int, b: Int): Int {
    return a + b
}

fun calculateDifference(a: Int, b: Int): Int {
    return a - b
}

Файл должен называться осмысленно. Названия вроде aaa.kt или Test2.kt IDEA стерпит, но вы сами запутаетесь в них через пару дней.

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

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

Пример правильной структуры:

MyFirstProject/
├── src/
│   └── com/kotlin/lesson05/
│       └── Main.kt
├── resources/
│   └── config.txt

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

Слово package написано не на первой строке
В Kotlin объявление пакета package обязано быть первой значимой строкой в файле (комментарии до него писать можно, а вот код или импорты — нет). Если вы напишете импорты, а под ними пакет — компилятор выдаст ошибку.

Несовпадение структуры папок и пакета
Если в начале файла написано package com.kotlin.lesson05, а сам файл физически лежит просто в src, IDEA подчеркнет название пакета желтым, предупреждая о несоответствии. Помните о правилах хорошего тона: папки должны отражать пакеты!

Ручное перемещение файлов через проводник Windows/macOS
Если вы переместили файл .kt в другую папку через обычный проводник на компьютере, строка package внутри файла сама не обновится, и проект сломается. Делайте перемещения (Drag and Drop) только внутри окна Project в IntelliJ IDEA — умная среда сама обновит все пакеты и пути!

1
Задача
Kotlin SELF, 5 уровень, 4 лекция
Недоступна
Поиск слабого места
Поиск слабого места
1
Задача
Kotlin SELF, 5 уровень, 4 лекция
Недоступна
Копилка без мусора
Копилка без мусора
1
Задача
Kotlin SELF, 5 уровень, 4 лекция
Недоступна
Цифра в сообщении
Цифра в сообщении
1
Задача
Kotlin SELF, 5 уровень, 4 лекция
Недоступна
Лимит по бюджету
Лимит по бюджету
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ