文章目录
一.前言
gradle有突出的版本不兼容问题.因此要注意
SpringBoot对Gradle的要求
,以及
IDEA对Gradle的要求
.
在IDEA的plugins/lib/gradle中规定了gradle的最大版本号. 在2022.2.1中是6.7 在2022.3.2中是7.4.
其余自行查看该位置的版本控制.不过idea规定的版本号可以更改.
查看SpringBoot与Gradle的兼容性
二.下载Gradle
Gradle官网地址
下载完整版解压后
系统变量配置Gradle仓库
键必须为GRADLE_USER_HOME
系统变量配置Gradle全局系统变量 gradle的bin目录
验证 gradle -v
三.Gradle镜像源-全局级配置
Gradle使用maven定位镜像地址参考: 阿里云云效Maven
全局配置 在Gradle的init.d目录下新建gradle为后缀的文件.
allprojects {
repositories {
maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public"}
maven { name "google"; url 'https://maven.aliyun.com/repository/google'}mavenCentral()}
buildscript {
repositories {
maven { name "Alibaba"; url 'https://maven.aliyun.com/repository/public'}
maven { name "gradle-plugin"; url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { name "spring-plugin"; url 'https://maven.aliyun.com/repository/spring-plugin'}
maven { name "M2"; url 'https://plugins.gradle.org/m2/'}}}}
四.配置Gradle wrapper-项目级配置
解决项目在多台电脑开发时,Gradle环境不一致,idea不兼容等问题.
Gradle指令调用本地的gradle脚本.而在项目中应当运行gradlew才是调用项目中的wrapper脚本
gradlew wrapper --gradle-version=6.7
当执行
gradlew.bat classes
gradlew.bat test
gradlew.bat build
等,会下载gradle相关内容
五.Gradle对测试的支持
test{useJUnitPlatform()// 支持对junit5测试}
五.生命周期
Gradle项目的生命周期分为三大阶段: Initialization ->Configuration -> Execution.每个阶段都有自己的职责,具体如下图所示:
Initialization 只执行一次初始化脚本.
Configuration 先执行加载父脚本,再是子脚本,再是孙子脚本
5.1 settings文件
六.Gradle任务入门
6.1 任务行为
def map =newHashMap<String,Object>();//action属性可以设置为闭包,设置task自身的行为
map.put("action",{println "task one.."})
task (map,"task1"){// 任务的配置段:在配置阶段执行
println "最先执行"// 任务的行为:在执行阶段执行,doFirst会在doLast执行之前执行
doFirst {
println "task1 doFirst"}
doLast {
println "task1 doLast"}}
task.doFirst {
println "task1 doFirst outer"}
task.doLast {
println "task1 doLast outer"}
6.2 任务依赖方式
七. Dependencies依赖引入
除非涉及到多模块依赖,为了避免重复依赖,咱们会使用api,其它情况我们优先选择implementation,拥有大量的api 依赖项会显著增加构建时间。
7.1 依赖冲突及解决方案
依赖冲突是指 “在编译过程中, 如果存在某个依赖的多个版本, 构建系统应该选择哪个进行构建的问题”,如下所示:
A、B、C 都是本地子项目 module,log4j 是远程依赖。
编译时: B 用 1.4.2 版本的 log4j,C 用 2.2.4 版本的 log4j,B 和 C 之间没有冲突
打包时: 只能有一个版本的代码最终打包进最终的A对应的jar |war包,对于 Gradle 来说这里就有冲突了
默认下,Gradle 会使用最新版本的 jar 包【考虑到新版本的 jar 包一般都是向下兼容的】,实际开发中,还是建议使用官方自带的这种解决方案。当然除此之外,Gradle 也为我们提供了一系列的解决依赖冲突的方法: exclude 移除一个依赖,不允许依赖传递,强制使用某个版本。
● Exclude 排除某个依赖
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'implementation('org.hibernate:hibernate-core:3.6.3.Final'){//排除某一个库(slf4j)依赖:如下三种写法都行
exclude group:'org.slf4j' exclude module:'slf4j-api'
exclude group:'org.slf4j',module:'slf4j-api'}//排除之后,使用手动的引入即可。implementation 'org.slf4j:slf4j-api:1.4.0'}
● 不允许依赖传递 在添加依赖项时,如果设置 transitive 为false,表示关闭依赖传递。即内部的所有依赖将不会添加到编译和运行时的类路径。
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' implementation('org.hibernate:hibernate-core:3.6.3.Final'){
//不允许依赖传递,一般不用
transitive(false)}
//排除之后,使用手动的引入即可implementation 'org.slf4j:slf4j-api:1.4.0'}
● 强制使用某个版本
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' implementation('org.hibernate:hibernate-core:3.6.3.Final')
//强制使用某个版本!!【官方建议使用这种方式】
implementation('org.slf4j:slf4j-api:1.4.0!!')
//这种效果和上面那种一样,强制指定某个版本implementation('org.slf4j:slf4j-api:1.4.0'){
version{
strictly("1.4.0")}}}
八.Gradle整合多模块SpringBoot
SpringBoot官网整合说明
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
模块聚合./settings.gradle
新建.gradle后缀的文件做版本管理
config.gradle
ext {
lombokVerison ='1.18.24'
mybatisPlusVersion ='3.5.2'
druidVersion ='1.2.8'
mysqlVersion ='8.0.32'
commonsVersion ='3.12.0'}
./build.gradle抽取公共配置, 编码,环境,镜像源
// 加载构建期需要的插件
buildscript {
repositories {
maven { name "Alibaba"; url 'https://maven.aliyun.com/repository/public'}
maven { name "google"; url 'https://maven.aliyun.com/repository/google'}
maven { name "gradle-plugin"; url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { name "spring-plugin"; url 'https://maven.aliyun.com/repository/spring-plugin'}
maven { name "M2"; url 'https://plugins.gradle.org/m2/'}mavenCentral()}// 维护插件版本
dependencies {classpath('org.springframework.boot:spring-boot-gradle-plugin:2.6.3')}}// 导入插件
plugins {
id 'java-library'}
group 'com.vector'
version '1.0-SNAPSHOT'// 读取gradle版本配置
apply from:'config.gradle'// 对所有子模块做统一管理
subprojects {//添加插件 目前Gradle版本不支持在allprojects下声明plugins,使用的是旧的写法
apply plugin:'java-library'
apply plugin:'org.springframework.boot'//维护springboot版本号,不单独使用,和下面两个插件一起用
apply plugin:'io.spring.dependency-management'// 相当于<dependencyManagement>版本管理//基本JDK配置sourceCompatibility = 1.8
sourceCompatibility =1.8
targetCompatibility =1.8
compileJava.options.encoding "UTF-8"
compileTestJava.options.encoding "UTF-8"
tasks.withType(JavaCompile).configureEach {
options.encoding ="UTF-8"}// SpringBoot Plugin生效的非常关键的设置// 主启动类位置
bootJar {
mainClass.set('org.vector.Main')}//依赖的配置:设置通用的依赖
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
compileOnly group:'org.projectlombok', name:'lombok', version: lombokVerison
}
test {useJUnitPlatform()}}project("module01"){
apply plugin:'java-library'//支持api
dependencies {
compileOnly group:'org.projectlombok', name:'lombok', version: lombokVerison
}}project("module02"){
apply plugin:'java-library'//支持api
dependencies {// implementation不会进行依赖传递. api可以进行依赖传递
api project(':module01')// mp持久化框架
implementation group:'com.baomidou', name:'mybatis-plus-boot-starter', version: mybatisPlusVersion
// druid连接池
implementation group:'com.alibaba', name:'druid-spring-boot-starter', version: druidVersion
// mysql数据库
implementation group:'mysql', name:'mysql-connector-java', version: mysqlVersion
}}project("module03"){
dependencies {// 不需要在继续依赖传递
implementation project(':module02')// spring-boot-starter-web
implementation 'org.springframework.boot:spring-boot-starter-web'//spring-boot-starter-test
testImplementation 'org.springframework.boot:spring-boot-starter-test'// spring-boot-starter-aop
implementation 'org.springframework.boot:spring-boot-starter-aop'//spring-boot-starter-data-redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'// commons工具类
implementation group:'org.apache.commons', name:'commons-lang3', version: commonsVersion
}}
那么可以自行探寻更优雅的写法.
九. Gradle整合微服务SpringCloud
项目结构
创建version.gradle
ext {
version =["lombokVerison":"1.18.24","mybatisPlusVersion":"3.5.2","druidVersion":"1.2.8","mysqlVersion":"8.0.32","commonsVersion":"3.12.0"]// 公共依赖
dependencies =["lombok":"org.projectlombok:lombok:${version.lombokVerison}","druid":"com.alibaba:druid-spring-boot-starter:${version.druidVersion}","mysql":"mysql:mysql-connector-java:${version.mysqlVersion}","common-lang3":"org.apache.commons:commons-lang3:${version.commonsVersion}","mybatisPlus":"com.baomidou:mybatis-plus-boot-starter:${version.mybatisPlusVersion}"]}
./build.gradle
description '微服务父工程'//构建Gradle脚本自身需要的资源,可以声明的资源包括依赖项、第三方插件、maven仓库地址等。
buildscript {
ext {
springBootVersion ='2.6.3'
springCloudversion ='2021.0.1'
springCloudAlibabaVersion ='2021.1'
springBootGradlePlugin ='2.6.3'}
repositories {
maven { name "Alibaba"; url 'https://maven.aliyun.com/repository/public'}
maven { name "google"; url 'https://maven.aliyun.com/repository/google'}
maven { name "gradle-plugin"; url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven { name "spring-plugin"; url 'https://maven.aliyun.com/repository/spring-plugin'}
maven { name "M2"; url 'https://plugins.gradle.org/m2/'}mavenCentral()}// 维护插件版本
dependencies {classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootGradlePlugin}")}}
group 'com.vector'
version '1.0-SNAPSHOT'// 读取gradle版本配置
apply from:'version.gradle'// 对所有子模块做统一管理
subprojects {//添加插件 目前Gradle版本不支持在allprojects下声明plugins,使用的是旧的写法
apply plugin:'java-library'
apply plugin:'org.springframework.boot'//维护springboot版本号,不单独使用,和下面两个插件一起用
apply plugin:'io.spring.dependency-management'// 相当于<dependencyManagement>版本管理// 将配置信息加载进声明中.版本控制
dependencyManagement{
dependencies {for(depJar in rootProject.ext.dependencies){
dependency depJar.value
}}
imports {// spring-cloud-dependencies
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudversion}"// spring-cloud-alibaba-dependencies
mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"}}//依赖的配置:设置通用的依赖
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'// spring-boot-starter
implementation 'org.springframework.boot:spring-boot-starter'// spring-cloud-starter-alibaba-nacos-discovery
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'// spring-cloud-starter-alibaba-nacos-config
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'// spring-cloud-alibaba-sentinel-gateway
implementation 'com.alibaba.cloud:spring-cloud-alibaba-sentinel-gateway'}//基本JDK配置sourceCompatibility = 1.8
sourceCompatibility =1.8
targetCompatibility =1.8
compileJava.options.encoding "UTF-8"
compileTestJava.options.encoding "UTF-8"
tasks.withType(JavaCompile).configureEach {
options.encoding ="UTF-8"}
test {useJUnitPlatform()}}project("module01"){
description ("微服务模块1")
apply plugin:'java-library'//支持api
dependencies {//lombok
api "org.projectlombok:lombok"
api "mysql:mysql-connector-java"
api "org.apache.commons:commons-lang3"}}project("module02"){
description ("微服务模块2")
apply plugin:'java-library'//支持api
dependencies {// mp持久化框架
implementation 'com.baomidou:mybatis-plus-boot-starter'// druid-spring-boot-starter
implementation 'com.alibaba:druid-spring-boot-starter'// mysql数据库
implementation 'mysql:mysql-connector-java'}}project("module03"){
description ("微服务模块3")
dependencies {// spring-boot-starter-web
implementation 'org.springframework.boot:spring-boot-starter-web'//spring-boot-starter-test
testImplementation 'org.springframework.boot:spring-boot-starter-test'// spring-boot-starter-aop
implementation 'org.springframework.boot:spring-boot-starter-aop'//spring-boot-starter-data-redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'// commons工具类
implementation 'org.apache.commons:commons-lang3'}}
版权归原作者 呆萌小新@渊洁 所有, 如有侵权,请联系我们删除。