假设我有一个多模块 Gradle Kotlin 项目。结构如下:
主
- 应用程序运行器将所有内容粘合在一起模块
用户
用户适配器
用户域
订单-适配器
订单域
现在,我希望能够有选择地管理依赖关系。我的意图是:
域
模块完全不受第三方限制。这里的类路径上不应该有第三方库适配器
模块都应该能够接收所有或选择性地选择集中声明的第三方依赖项我想在根< code>build.gradle.kts中声明< code >子项目{},但这会影响所有模块,同时我想保持< code >域模块不变。
有没有办法让我喜欢:
如何实现这一点?
我一直在尝试Gradle的六边形架构,我发现下面的设置非常适合我。
(请原谅使用静态编程语言DSL
,因为在撰写此答案时,我只有一个repo要演示)。
首先,这是我遵循的包结构:
<project root>
| build.gradle.kts
| ...
└─── apps
| └─── <putting everything together>
| | build.gradle.kts
| | ...
└─── core
| └─── <business logic>
| | build.gradle.kts
| | ...
└─── libs
└─── <some common lib>
| build.gradle.kts
| ...
让我们关注项目根目录中的build.gradle.kts
:
plugins {
id("io.spring.dependency-management") version "1.0.12.RELEASE"
}
subprojects {
apply(plugin = "io.spring.dependency-management")
dependencyManagement {
dependencies {
dependency("ch.qos.logback:logback-classic:1.2.11")
dependency("org.javamoney:moneta:1.4.2")
dependency("nl.hiddewieringa:money-kotlin:1.0.1")
dependencySet("io.jsonwebtoken:0.11.5") {
entry("jjwt-api")
entry("jjwt-impl")
}
}
}
}
configure(subprojects) {
dependencies {
implementation("ch.qos.logback:logback-classic")
testImplementation(kotlin("test"))
}
tasks.test {
useJUnitPlatform()
}
}
快速解释一下,< br >我使用的是Spring IO的Gradle插件,它可以在一个地方跨项目声明包及其版本。如果你观察,我只在子项目中使用这个插件。< br >现在在配置中,我保留了适用于所有子项目的通用配置。
让我们跳到<代码>核心部分-
dependencies {
api("nl.hiddewieringa:money-kotlin")
}
在这里,你可以看到核心只使用mone-kotlin
(静态编程语言扩展javax.money),这只是api。
请注意,由于记录器是在子项目的配置中定义的,我可以在核心逻辑中使用它来定义日志。此外,版本是从主Gradle文件中提到的版本中获取的。
对于< code>libs来说也是类似的情况
最后应用程序-
dependencies {
api("io.jsonwebtoken:jjwt-api")
api("nl.hiddewieringa:money-kotlin")
implementation("org.javamoney:moneta")
runtimeOnly("io.jsonwebtoken:jjwt-impl")
}
在这里,我使用moneta
(将逻辑和api与实际impl分开)应用java-Money的实际实现。类似地,jjwt
仅在这里应用。
这样,所有的版本都被控制在一个地方。逻辑被从iml细节中分离出来。
正如我所看到的,这涵盖了六边形模式所需的大多数东西。
希望它能有所帮助。