Gradle Kotlin DSL 多模塊項目案例


版本信息

ide: idea2020.1
jdk: openjdk8
gradle: 6.8.3

搭建項目

  1. 新建 Gradle 項目
    image
    選擇 gradle,勾選 Kotlin DSL構建腳本,最后下一步:
    image
    自定義項目的名稱、groupId、artifactId和version:
    image
    項目初始結構:
    image

  2. 修改 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"
    }
}
  1. 修改 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)
        }
    }

}
  1. 新建子模塊
    在當前模塊下新建文件夾 common,並在 common 文件夾下新建文件 common.gradle.kts :
    image
    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 項目,依賴生效

  1. 測試子模塊
    在子模塊中添加 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 視圖中查看依賴是否添加:
image
新建目錄:src/main/java:
image
image
在新建一個Main類,添加主函數入口 main 方法:
image
image

  1. 新建子子模塊
    刪除src目錄,並在 common 下新增目錄 common-sub,並在 common-sub 下新增 common-sub.gradle.kts:
    image
    修改 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"
    }
}

此時子子模塊創建完成,其他使用方式和子模塊一致:
image

  1. 子模塊和子子模塊的引用
    新建 service 模塊,方式和上面模塊新建方式一致。修改 service.gradle.kts 腳本:
description = "service 模塊"

plugins {
    java
}

dependencies {
    // 引用子模塊
    implementation(project(":common"))
    // 引用子子模塊
    implementation(project(":common:common-sub"))
}

image

打包的一些問題

如果你要使用 springboot 相關的框架,可以使用spring官方提供的插件 org.springframework.boot 配合 io.spring.dependency-management 插件使用,打包jar包時,需要打包成jar包的項目,比如 common-sub 項目需要添加如下的配置,不然可能會出現在ide上運行沒有問題,但是打包出來卻缺少了對應的 common-sub.jar 包:

tasks.withType<Jar> {
	enabled = true
}

image

注意:使用 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)
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM