me
Ivan Borisov
Computer science student at ITMO University. Interested in programming, Linux and Emacs.

Проект Gradle для курса Java-Advanced

Table of Contents

Гайд на основе того, как я собрал проект для сдачи домашних заданий на курсе java-advanced.

Предисловие

Делегируя настройку проекта графическому интерфейсу idea, меня не покидало чувство, что что-то важное происходит под капотом. А я люблю, чтобы вся логика была расписана в тексте – в виде билдов/конфигов/скриптов. Если вам близки такие интенции, то, возможно, вам понравится этот способ сборки проекта для сдачи дз с помощью Gradle.

Гайд чисто практический, я освоил Gradle лишь постольку, поскольку этого требует курс java. Поэтому критика приветствуется. Как по мне, в итоге получилось сильно проще, чем копаться GUI.

Установка Gradle

Посмотрите как установить gradle на вашу ОС, с этим не должно возникнуть проблем. Приведу несколько примеров, но в дальнейшем установка будет ориентирована на Linux.

Arch

sudo pacman -S gradle

Ubuntu

sudo apt update
sudo apt install gradle

MacOS

С помощью Homebrew.

brew install gradle

Windows

Следуйте официальной инструкции на сайте.

Инициализация проекта

Создайте директорию для проекта и перейдите в неё:

mkdir java-advanced
cd java-advanced

Инициализируйте проект:

gradle init

Далее вам предложат выбрать опции, я предлагаю такие:

  1. Select type of build to generate – Basic
  2. Project name – Нажмите Enter, чтобы выбрать дефолтное
  3. Select build script DSL – Groovy
  4. Generate build using new APIs and behavior – no

Появится такая структура файлов и директорий:

.
├── build.gradle
├── gradle
│   ├── libs.versions.toml
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

Клонирование репозиториев

В корне проекта создайте директории:

  • shared/ – Для тестов
  • solutions/ – Для ваших решений

Сделать можно одной командой:

mkdir shared solutions

Склонируйте в shared/ репозиторий с тестами (git у вас, думаю, есть):

git clone https://www.kgeorgiy.info/git/geo/java-advanced-2025.git shared

Склонируйте в solutions/ ваш персональный репозиторий:

git clone https://www.kgeorgiy.info/git-students/year2023/<USER>/java-advanced solutions

Вместо <USER> – свой юзернейм, также git попросит ввести свой юзернейм и пароль.

Конфигурация build.gradle

Заходим в build.gradle в корне проекта с помощью любимого редактора/IDE. Удаляем комментарии, которые там есть, вставляем этот код:

plugins {
    id 'java'
}

group = 'org.example'
version = '1.0-SNAPSHOT'

repositories {
    mavenCentral()
    flatDir {
        dirs 'shared/lib'
    }
}

dependencies {
    implementation fileTree(dir: 'shared/lib', include: ['*.jar'])
    implementation files('shared/artifacts/info.kgeorgiy.java.advanced.base.jar')
    testImplementation files('shared/artifacts/info.kgeorgiy.java.advanced.base.jar')
}

sourceSets {
    main {
        java {
            srcDirs = ['solutions/java-solutions']
        }
    }
}

def createTask(String taskName, String testName, String cutClass, String srcDir, String mainClassName) {
    tasks.register(taskName, JavaExec) {
        sourceSets.test.java.srcDirs = [srcDir]
        classpath = sourceSets.test.runtimeClasspath
        mainClass = mainClassName
        args testName, cutClass
    }
}

createTask("WalkTest",
        "Walk",
        "info.kgeorgiy.ja.borisov.walk.Walk",
        "shared/modules/info.kgeorgiy.java.advanced.walk",
        "info.kgeorgiy.java.advanced.walk.Tester")

Из кода несложно понять, что мы подтягиваем зависимости, указываем директорию исходников. При желании можете разобраться как работать с репозиторием maven.

Функция, с которой мы будем работать, это createTask – она нужна для создания задач. Каждая задача конфигурирует запуск конкретных тестов для конкретного домашнего задания. Из сигнатуры функции понятно, что для запуска тестов нам нужно:

  1. Имя, по которому мы в дальнейшем будем запускать задачу (taskName)
  2. Название модификации (testName). Его нужно менять, если хотите запустить другой вариант
  3. Тестируемый класс (cutClass)
  4. Директория с тестами (srcDir)
  5. Тестирующий класс (mainClassName)

Обратите внимание, что директорию исходников (java-solutions), мы указывали ранее, а директории тестов меняются от дз к дз, поэтому их мы указываем динамически в функции.

И, последнее, вызываем функцию createTask с нужными нам параметрами, тем самым регистрируя задачу для тестирования. Для примера, как создать задачу для дз Walk:

createTask("WalkTest",
        "Walk",
        "info.kgeorgiy.ja.borisov.walk.Walk",
        "shared/modules/info.kgeorgiy.java.advanced.walk",
        "info.kgeorgiy.java.advanced.walk.Tester")

Тесты для других домашних заданий делаются по аналогии и добавляются в конец файла build.gradle.

Билд и запуск

Сборка проекта:

./gradlew clean build

Запуск тестов выполняется с передачей названия задачи, которую мы создали. То есть WalkTest:

./gradlew WalkTest

Заключение

Я повторил все шаги с нуля, у меня всё работает. Прежде чем идти на сдачу, убедитесь, что вы понимаете как всё работает. Я всего лишь поделился тем, как собираю проект.

Заметки с ссылками на эту страницу