Gradle8.4構建SpringBoot多模塊項目

来源:https://www.cnblogs.com/kakarotto-chen/archive/2023/10/31/17784126.html
-Advertisement-
Play Games

Gradle8.4構建SpringBoot多模塊項目 一、基本 1、版本 這個版本是Jdk8最後一個SpringBoot版本 軟體 版本 Gradle 8.4 SpringBoot 2.7.15 JDK 8 2、Gradle基本介紹 2.1、使用Wrapper方式構建 好處:統一gradle的版本 ...


Gradle8.4構建SpringBoot多模塊項目

一、基本

1、版本

  • 這個版本是Jdk8最後一個SpringBoot版本
軟體 版本
Gradle 8.4
SpringBoot 2.7.15
JDK 8

2、Gradle基本介紹

2.1、使用Wrapper方式構建

  • 好處:統一gradle的版本
  • 好處:不用安裝gradle就可以使用
  • Maven也是一樣的可以用Wrapper的方式

2.2、導包方式

  • 列舉常用的四種
implementation
api
compileOnly
compileOnlyApi

①、implementation

  • 導入依賴,不傳遞給子模塊,依賴項將被編譯和打包到項目中

②、api

  • 導入依賴,傳遞給子模塊,依賴項將被編譯和打包到項目中

③、implementation和api的區別

④、compileOnly

  • 導入依賴,不傳遞給子模塊,依賴項將被編譯到項目中,不打包到項目

⑤、compileOnlyApi

  • 導入依賴,傳遞給子模塊,依賴項將被編譯到項目中,不打包到項目

2.3、build.gradle配置文件

  • 相當於Maven的pom文件,主要是配置模塊,導入依賴的作用

①、allprojects

  • 裡面的配置,所有模塊生效
  • 一般配置包的信息、編碼、倉庫地址
allprojects {

}

②、subprojects

  • 裡面的配置,只有自己和子模塊生效
  • 一般配置插件、統一包的版本管理、打包方式等等
subprojects {

}

③、dependencies

  • 導入依賴,相當於Maven的<dependency></dependency> 導包
  • 引入依賴演示
dependencies {
    // api可以傳遞依賴、implementation不能傳遞依賴
    // hutool工具類
    api 'cn.hutool:hutool-all'
}
  • 引入模塊演示
dependencies {
    //依賴公共模塊
    api project(":模塊地址")
    implementation project(":GradleParent:GradleUtil")
}

2.4、settings.gradle配置文件

  • 配置模塊間的信息,見後面具體實現

二、實現

1、項目結構

-GradleMultiModule
 -GradleParent          包裝common、util的父模塊(實際中可以不要,這裡演示導包、傳遞依賴等)
  -GradleCommon         公共模塊,用於裝entity或者mapper等
  -GradleUtil           工具類模塊
 -GradleServer          業務模塊的父模塊,用於給子模塊統一導入springboot的包
  -GradleOne            業務模塊1 - 依賴GradleCommon、GradleUtil
  -GradleTwo            業務模塊2 - 依賴
  -GradleStart          啟動模塊 - 導入GradleOne、GradleTwo依賴,啟動項目
  • 結構
    image

2、新建模塊

  • 只演示一遍
  • 就是用idea創建springboot的gradle項目

image

3、各個模塊的配置及類

3.1、GradleMultiModule模塊

  • 頂級父模塊

  • 統一配置 build.gradle (還可以配置gradle的版本)

  • 配置所有模塊的關係 settings.gradle

  • ①、build.gradle

  • wrapper:配置gradle的版本,需要單獨點擊執行,執行後查看gradle版本是否生效

image

  • 具體配置
//插件
plugins {
    id 'java'
    id 'idea'
    id 'java-library'
    id 'org.springframework.boot' version '2.7.15'
    id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}

//allprojects:所有模塊生效
allprojects {
    // 配置項目信息
    group = 'com.cc'
    version = '0.0.1-SNAPSHOT'
    // 配置字元編碼
    tasks.withType(JavaCompile).configureEach {
        options.encoding = 'UTF-8'
    }

    java {
        sourceCompatibility = '8'
        targetCompatibility = '8'
    }

    //倉庫配置
    repositories {
        //本地
        mavenLocal()
        //阿裡倉庫
        maven { url 'https://maven.aliyun.com/repository/public/' }
        //公司倉庫。必須用:https。Gradle預設情況下不允許使用不安全的協議,以提高安全性。
        maven { url 'https://******:****/repository/maven-public/' }
        //中央倉庫
        mavenCentral()
    }

}

//subprojects:所有子模塊生效——springboot配置、導包版本管理、打包管理
subprojects {
    apply plugin: 'java'
    apply plugin: 'java-library'
    apply plugin: 'idea'
    //所有子模塊都是springboot項目,如不是,不能打包。
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    //所有子模塊的-依賴版本管理
    dependencyManagement {
        dependencies {
            dependency 'cn.hutool:hutool-all:5.0.7'
            dependency "org.apache.commons:commons-lang3:3.5"
        }
    }

    //使用 gradle打包工具
    jar {
        manifest.attributes provider: 'gradle'
    }

    tasks.named('test') {
        useJUnitPlatform()
    }

}

// 配置gradle的版本
wrapper {
    //gradle的版本
    gradleVersion = '8.4'
    //版本類型:BIN、ALL(完全版,可以看gradle的代碼)
    distributionType = 'ALL'
}
  • ①、settings.gradle

  • 配置模塊間的關係

  • 可以新增一個模塊配置一個模塊,不用一次性配置完成

  • 具體配置

rootProject.name = 'GradleMultiModule'

//公共模塊總模塊
include 'GradleParent'
include ':GradleParent:GradleCommon'
include ':GradleParent:GradleUtil'
project(':GradleParent:GradleCommon')?.name = 'GradleCommon'
project(':GradleParent:GradleUtil')?.name = 'GradleUtil'

//業務模塊總模塊
include 'GradleServer'
include ':GradleServer:GradleStart'
include ':GradleServer:GradleOne'
include ':GradleServer:GradleTwo'
project(':GradleServer:GradleStart')?.name = 'GradleStart'
project(':GradleServer:GradleOne')?.name = 'GradleOne'
project(':GradleServer:GradleTwo')?.name = 'GradleTwo'

3.2、GradleParent模塊(公共)

  • 統一公共模塊依賴

  • build.gradle

//配置所有子模塊
subprojects {
    //這裡可以導入公共的依賴
    dependencies {
        // compileOnly:這樣做可以確保Lombok在編譯時可用,但不會包含在最終的構建產物中,從而減小構建產物的大小。
        // api:依賴可以傳遞給子模塊
        // compileOnlyApi:僅編譯時可用,不包含在構建產物中,並且可以傳遞給子模塊
        compileOnlyApi 'org.projectlombok:lombok'
        // 表示將Lombok庫作為註解處理器導入。
        annotationProcessor 'org.projectlombok:lombok'
    }
}

3.3、GradleCommon模塊(公共)

  • 公共模塊,存放Entity

  • build.gradle

dependencies {
    // api可以傳遞依賴、implementation不能傳遞依賴
    // hutool工具類
    api 'cn.hutool:hutool-all'
}

新建的類
image

3.4、GradleUtil模塊(公共)

  • 存放所有工具類

  • build.gradle

dependencies {
    // api可以傳遞依賴、implementation不能傳遞依賴
    api 'org.apache.commons:commons-lang3'
}

新建類
image

3.5、GradleServer模塊(業務)

  • 業務模塊的父模塊,用於統一導入springboot的包

  • build.gradle

// 子模塊生效
subprojects {
    //配置子模塊依賴
    dependencies {
        //導入業務模塊的公共包 - SpringBoot的包
        //不用api,不用傳遞
        implementation 'org.springframework.boot:spring-boot-starter'
        implementation 'org.springframework.boot:spring-boot-starter-web'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
}

3.6、GradleOne模塊(業務)

  • 引入:GradleCommon、GradleUtil模塊

  • 測試是否能使用引入模塊的類、引入模塊的依賴

  • build.gradle

dependencies {
    //依賴公共模塊
    //api傳遞給子模塊
    api project(":GradleParent:GradleCommon")
    api project(":GradleParent:GradleUtil")
}
  • 啟動提示
    image

  • 測試
    image

3.7、GradleTwo模塊(業務)

  • 引入:GradleCommon、GradleUtil模塊

  • 測試是否能使用引入模塊的類、引入模塊的依賴

  • build.gradle

dependencies {
    //依賴公共模塊:implementation不傳遞依賴;api傳遞依賴
    //這裡不傳遞依賴,因為會造成GradleStart有多個重覆依賴
    implementation project(":GradleParent:GradleCommon")
    implementation project(":GradleParent:GradleUtil")
}
  • 啟動提示
    image

  • 測試
    image

3.8、GradleStart啟動模塊(業務)

  • 啟動springboot項目

  • 引入所有業務模塊

  • 配置SpringMVc

  • 此模塊不寫任何的業務

  • build.gradle

dependencies {
    // 依賴GradleOne、GradleTwo,將該模塊納入啟動中(加入springboot項目中)
    api project(':GradleServer:GradleOne')
    api project(':GradleServer:GradleTwo')

    // 其他依賴項...
}
  • SpringMvc配置
package com.cc.go.config;

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.util.ArrayList;

/** <p>SpringMvc配置<p>
 * <li>自定義Spring MVC的特性和擴展Spring MVC的功能</li>
 * @since 2023/9/21
 * @author CC
 **/
@SpringBootConfiguration
public class WebGlobalConfig implements WebMvcConfigurer {

    @Resource
    private MyHandlerInterceptor myHandlerInterceptor;

    /**
     * 攔截器(Interceptors)
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        ArrayList<String> list = new ArrayList<>();
        list.add("/login");
        //自定義攔截器,或其他攔截器
        registry.addInterceptor(myHandlerInterceptor)
                //添加攔截地址為所有攔截
                .addPathPatterns("/**")
                //不攔截的地址
                .excludePathPatterns(list);
    }

    /**
     * 資源處理器(Resource Handlers)
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**")
                .addResourceLocations("classpath:/resources/","classpath:/static/");
    }

    /**
     * 跨域資源共用(CORS)
     */
    @Bean
    public CorsFilter corsFilter() {
        //創建CorsConfiguration對象後添加配置
        CorsConfiguration config = new CorsConfiguration();
        //允許所有原始域
        config.addAllowedOriginPattern("*");
        //允許所有頭部信息
        config.addAllowedHeader("*");
        //允許所有頭部信息
        config.addExposedHeader("*");
        //放行的請求方式
//        config.addAllowedMethod("GET");
//        config.addAllowedMethod("PUT");
//        config.addAllowedMethod("POST");
//        config.addAllowedMethod("DELETE");
        config.addAllowedMethod("*");     //放行全部請求

        //是否發送Cookie
        config.setAllowCredentials(true);

        //2. 添加映射路徑
        UrlBasedCorsConfigurationSource corsConfigurationSource =
                new UrlBasedCorsConfigurationSource();
        corsConfigurationSource.registerCorsConfiguration("/**", config);
        //返回CorsFilter
        return new CorsFilter(corsConfigurationSource);
    }
}
  • 啟動類
package com.cc.go;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/** <p>啟動類<p>
 * @since 2023/9/20
 * @author CC
 **/
@SpringBootApplication
public class GradleStartApplication {

    public static void main(String[] args) {
        SpringApplication.run(GradleStartApplication.class, args);
    }

}
  • application.yml
server:
  port: 2222

三、測試

1、傳遞依賴測試,在二實現中,已經驗證了,能引入依賴

2、啟動測試,測試業務模塊的介面調用

  • 啟動項目,模塊啟動
    image

  • 介面調用
    image

  • 調用後列印的
    image

四、總結


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 需求 任務隊列中可以依次添加任務; 任務執行函數需要接受外部傳輸的參數; 主動調用Start開始執行任務; 代碼實現 class TaskQueue { private: std::mutex mtx; std::condition_variable cv; std::queue<std::func ...
  • 用python添加參數都是用的input函數,不能添加預設值也不能輸入help提示。 最近發現了2個更好用的庫分享給大家。 一、使用input庫。 這個使用很簡單,就不過多描述了。 def test(a,b): print(f"{a}+{b}=" + str(int(a)+int(b)) ) if ...
  • super相關的介紹文章看了無數遍,每次看得都雲里霧裡的,沒過多久就忘了,只模糊知道跟MRO有關,但是稍微一複雜就不知道怎麼回事了,本篇文章主要記錄我對super的理解 1.粗暴簡單的理解 super的作用就是執父類的方法,雖然這句話不完全對,但是也差不多是那麼個意思了。 比如以單繼承為例 clas ...
  • 需求:有一個vo類,該類繼承了一個實體類,獲取到vo對象後,需要將其中的null值轉為空字元串; 思路:傳入參數,用Object接收,利用反射獲取到該對象的所有欄位,並判斷置空; 由於一開始沒有考慮到父類的欄位獲取,導致時不時出現錯誤,因此這裡簡單記錄一下。 // 無需返回object,set後對象 ...
  • File --JAVA 構造方法 方法說明 public File (String pathname) 根據文件路徑創建對象 public File (String parent, String child) 根據父路徑名字字元串和子路徑名字元串創建文件對象 public File (String ...
  • 作者今天在開發一個後臺發送消息的功能時,由於需要給多個用戶發送消息,於是使用了 mybatis plus 提供的 saveBatch() 方法,在測試環境測試通過上預發佈後,測試反應發送消息介面很慢得等 5、6 秒,於是我就登錄預發佈環境查看執行日誌,發現是 mybatis plus 提供的 sav ...
  • 各種閑著沒事的 scanf 奇葩用法 然而這些卻很好用誒。 同理,scanf 可以拓展到 sscanf、fscanf~ 例題:P1580 yyy loves Easter_Egg I、P7911 網路連接 未計入更加奇葩的 C 語言用法,比如 %i %a 這種明顯等價的轉換字元。 基礎1:整數輸入 ...
  • 今天在對接支付寶 APP 支付的時候遇到了一個報錯,記錄下問題的排查過程~ 報錯過程 APP 中彈窗提示的報錯“商家訂單參數異常,請重新發起付款”,檢查了下參數感覺沒啥問題,不知道是啥問題導致的。 去官網搜了下,折騰排查了一遍,發現是環境問題,沒有切到沙箱環境導致的 (*/ω\*) 。 先放個官網提 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...