版本信息
ide: idea2020.1
jdk: openjdk8
gradle: 6.8.3
搭建項目
-
新建 Gradle 項目
選擇 gradle,勾選 Kotlin DSL構建腳本,最后下一步:
自定義項目的名稱、groupId、artifactId和version:
項目初始結構:
-
修改
settings.gradle.kts
文件
rootProject.name = "module-demo"
// 遍歷子項目,將子項目的依賴配置腳本的名稱進行自定義(可以不自定義)
rootProject.children.forEach { project ->
project.buildFileName = "${project.name}.gradle.kts"
// 三層結構的多模塊項目會需要,如果只有兩層,去掉此處循環即可
project.children.forEach { p ->
p.buildFileName = "${p.name}.gradle.kts"
}
}
- 修改
build.gradle.kts
文件
plugins {
// 使用此插件管理依賴
id("io.spring.dependency-management") version "1.0.11.RELEASE"
}
group = "com.ninaco"
version = "1.0-SNAPSHOT"
description = "聚合工程 - 父工程"
// 所有項目都有的配置
allprojects {
repositories {
mavenLocal()
maven("https://maven.aliyun.com/nexus/content/repositories/google")
maven("https://maven.aliyun.com/nexus/content/groups/public")
maven("https://maven.aliyun.com/nexus/content/repositories/jcenter")
maven("https://plugins.gradle.org/m2/")
mavenCentral()
}
}
// 定義依賴的版本
var cloudVersion = "2021.0.0"
var cloudAlibabaVersion = "2.2.6.RELEASE"
var mybatisPlusVersion = "3.5.0"
var velocityVersion = "2.3"
// 子項目(子模塊)的配置
subprojects {
apply {
plugin("io.spring.dependency-management")
plugin("java-library")
}
group = "com.ninaco"
version = "1.0.0"
// 依賴管理,此功能是插件 io.spring.dependency-management 提供的,類似於 maven dependencyManagement 功能
dependencyManagement {
// 導入pom,類似於 Maven 中的 scope=import
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${cloudVersion}")
mavenBom("com.alibaba.cloud:spring-cloud-alibaba-dependencies:${cloudAlibabaVersion}")
}
// 定義依賴(此處定義的依賴,在子模塊中無需定義版本)
dependencies {
dependency("com.baomidou:mybatis-plus-boot-starter:${mybatisPlusVersion}")
dependency("org.apache.velocity:velocity-engine-core:${velocityVersion}")
}
// 生成自定義的Pom
generatedPomCustomization {
enabled(false)
}
// 解決方案策略
resolutionStrategy {
cacheChangingModulesFor(0, TimeUnit.SECONDS)
}
}
}
- 新建子模塊
在當前模塊下新建文件夾common
,並在common
文件夾下新建文件common.gradle.kts
:
在settings.gradle.kts
中新增代碼:
rootProject.name = "module-demo"
// 包含 common 子模塊(不需要添加 .gradle.kts 后綴)
include("common")
// 遍歷子項目,將子項目的依賴配置腳本的名稱進行自定義
rootProject.children.forEach { project ->
project.buildFileName = "${project.name}.gradle.kts"
// 三層接口的多模塊項目會需要,如果只有兩層,去掉此處循環即可
project.children.forEach { p ->
p.buildFileName = "${p.name}.gradle.kts"
}
}
更新 gradle 項目,依賴生效
- 測試子模塊
在子模塊中添加build.gradle.kts
中定義的依賴:
description = "common 模塊"
plugins {
`java-library`
}
tasks.withType<Jar> {
enabled = true
}
dependencies {
// implementation 只能在當前模塊使用的依賴
implementation("org.apache.velocity:velocity-engine-core")
// api 可以傳遞給引用當前模塊的項目使用的依賴(api 是在 java-library 插件中的方法)
// api("org.apache.velocity:velocity-engine-core")
}
可以在idea右側的 Gradle
視圖中查看依賴是否添加:
新建目錄:src/main/java:
在新建一個Main類,添加主函數入口 main 方法:
- 新建子子模塊
刪除src目錄,並在common
下新增目錄common-sub
,並在common-sub
下新增common-sub.gradle.kts
:
修改settings.gradle.kts
:
rootProject.name = "module-demo"
include("common")
include(":common:common-sub")
// 遍歷子項目,將子項目的依賴配置腳本的名稱進行自定義
rootProject.children.forEach { project ->
project.buildFileName = "${project.name}.gradle.kts"
// 三層接口的多模塊項目會需要,如果只有兩層,去掉此處循環即可
project.children.forEach { p ->
p.buildFileName = "${p.name}.gradle.kts"
}
}
此時子子模塊創建完成,其他使用方式和子模塊一致:
- 子模塊和子子模塊的引用
新建service
模塊,方式和上面模塊新建方式一致。修改service.gradle.kts
腳本:
description = "service 模塊"
plugins {
java
}
dependencies {
// 引用子模塊
implementation(project(":common"))
// 引用子子模塊
implementation(project(":common:common-sub"))
}
打包的一些問題
如果你要使用 springboot
相關的框架,可以使用spring官方提供的插件 org.springframework.boot
配合 io.spring.dependency-management
插件使用,打包jar包時,需要打包成jar包的項目,比如 common-sub 項目需要添加如下的配置,不然可能會出現在ide上運行沒有問題,但是打包出來卻缺少了對應的 common-sub.jar 包:
tasks.withType<Jar> {
enabled = true
}
注意:使用 springboot 時,打包jar包使用 bootJar 任務進行打包,不然可能會無法運行
如果不是 springboot 項目,不使用插件 org.springframework.boot
,那么推薦使用插件 com.github.johnrengelman.shadow
來進行打包 jar 包
注意:使用 shadowJar 插件時,打包jar包使用 shadowJar 任務進行打包
如下案例:
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
description = "子子模塊 common-sub"
plugins {
java
id("com.github.johnrengelman.shadow") version "5.1.0"
}
dependencies {
implementation("org.apache.velocity:velocity-engine-core")
}
tasks.named<ShadowJar>("shadowJar") {
archiveBaseName.set("shadow")
mergeServiceFiles()
manifest {
attributes(mapOf("Main-Class" to "com.ninaco.Main"))
}
}
tasks {
build {
dependsOn(shadowJar)
}
}