Пропустити до головного контенту

Багатомодульність

Створення різних модулів створює необхідність їхньої взаємодії між один одним. То ж, розберім види взаємодії, як робити не можна або не варто, та що взагалі до чого. Почнім!

У нас є наступна структура нашого проєкту: структура проєкту Де два наших модулі – це Kotlin/JVM:

foo/build.gradle.kts
plugins {
kotlin("jvm") version "1.7.21"
}

repositories {
mavenCentral()
}

dependencies {
implementation("io.ktor:ktor-server-core:2.1.0")
}
bar/build.gradle.kts
plugins {
kotlin("jvm") version "1.7.21"
}

repositories {
mavenCentral()
}

Залежність від модуля

До цього ми розглядали віддалені репозиторії, як джерело будь-яких бібліотек, але насправді, ми можемо опиратись не лише на них. Модуль «Bar», наприклад, може залежати від модуля «Foo».

Реалізуймо це:

bar/build.gradle.kts
plugins {
kotlin("jvm") version "1.7.21"
}

repositories {
mavenCentral()
}

dependencies {
implementation(project(":foo"))
}

Все дуже просто – за аналогією з вказуванням модулей в settings.gradle.kts!

варто знати

До речі, варто враховувати, що залежності модуля від якого ми залежимо – ми не бачимо. Щоб виправити це, ми можемо використати функцію api в блоці dependencies {} у модулі, від якого ми залежимо:

foo/build.gradle.kts
dependencies {
api("io.ktor:ktor-server-core:2.1.0")
}

Проблема циклічних залежностей

буде помилкою

Варто зазначити, хоча ми можемо залежити від якогось модуля, потрібно розуміти, що два модулі не можуть залежати один від одного, тобто, в нашому випадку, модуль «foo» не може залежати від «bar», тому що «bar» уже залежить від «foo». Це б створило нескінченну рекурсію залежностей, тому при спробі таке зробити, у вас з'явиться помилка.

Рішення

Подібну проблему можна вирішити за допомогою модуля-посередника (тобто третього модуля), який би допомагав взаємодіяти між модулями. У цьому модулі ми б винесли функції та об'єкти, що потрібні обом модулям.