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的區別
-
關於implementation、api的傳遞依賴具體問題可以見我的博問(感謝大佬:@basic60)
https://q.cnblogs.com/q/143866/ -
關於所有的導包方式的區別也可以見管網:
https://docs.gradle.org/current/userguide/java_library_plugin.html -
截圖
④、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依賴,啟動項目
- 結構
2、新建模塊
- 只演示一遍
- 就是用idea創建springboot的gradle項目
3、各個模塊的配置及類
3.1、GradleMultiModule模塊
-
頂級父模塊
-
統一配置 build.gradle (還可以配置gradle的版本)
-
配置所有模塊的關係 settings.gradle
-
①、build.gradle
-
wrapper:配置gradle的版本,需要單獨點擊執行,執行後查看gradle版本是否生效
- 具體配置
//插件
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'
}
新建的類
3.4、GradleUtil模塊(公共)
-
存放所有工具類
-
build.gradle
dependencies {
// api可以傳遞依賴、implementation不能傳遞依賴
api 'org.apache.commons:commons-lang3'
}
新建類
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")
}
-
啟動提示
-
測試
3.7、GradleTwo模塊(業務)
-
引入:GradleCommon、GradleUtil模塊
-
測試是否能使用引入模塊的類、引入模塊的依賴
-
build.gradle
dependencies {
//依賴公共模塊:implementation不傳遞依賴;api傳遞依賴
//這裡不傳遞依賴,因為會造成GradleStart有多個重覆依賴
implementation project(":GradleParent:GradleCommon")
implementation project(":GradleParent:GradleUtil")
}
-
啟動提示
-
測試
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、啟動測試,測試業務模塊的介面調用
-
啟動項目,模塊啟動
-
介面調用
-
調用後列印的
四、總結
- 項目地址(blog-code/SpringBoot/GradleMultiModule)
https://gitee.com/KakarottoChen/blog-code.git