Багатомодульність
Створення різних модулів створює необхідність їхньої взаємодії між один одним. То ж, розберім види взаємодії, як робити не можна або не варто, та що взагалі до чого. Почнім!
У нас є наступна структура нашого проєкту: Де два наших модулі – це Kotlin/JVM:
plugins {
kotlin("jvm") version "1.7.21"
}
repositories {
mavenCentral()
}
dependencies {
implementation("io.ktor:ktor-server-core:2.1.0")
}
plugins {
kotlin("jvm") version "1.7.21"
}
repositories {
mavenCentral()
}
Залежність від модуля
До цього ми розглядали віддалені репозиторії, як джерело будь-яких бібліотек, але насправді, ми можемо опиратись не лише на них. Модуль «Bar», наприклад, може залежати від модуля «Foo».
Реалізуймо це:
plugins {
kotlin("jvm") version "1.7.21"
}
repositories {
mavenCentral()
}
dependencies {
implementation(project(":foo"))
}
Все дуже просто – за аналогією з вказуванням модулей в settings.gradle.kts
!
До речі, варто враховувати, що залежності модуля від якого ми залежимо – ми не бачимо. Щоб виправити це, ми можемо
використати функцію api
в блоці dependencies {}
у модулі, від якого ми залежимо:
dependencies {
api("io.ktor:ktor-server-core:2.1.0")
}
Проблема циклічних залежностей
Варто зазначити, хоча ми можемо залежити від якогось модуля, потрібно розуміти, що два модулі не можуть залежати один від одного, тобто, в нашому випадку, модуль «foo» не може залежати від «bar», тому що «bar» уже залежить від «foo». Це б створило нескінченну рекурсію залежностей, тому при спробі таке зробити, у вас з'явиться помилка.
Рішення
Подібну проблему можна вирішити за допомогою модуля-посередника (тобто третього модуля), який би допомагав взаємодіяти між модулями. У цьому модулі ми б винесли функції та об'єкти, що потрібні обом модулям.