簡(jiǎn)介
Gradle 這是一個(gè)基于 JVM 的富有突破性構(gòu)建工具。Gradle 正迅速成為許多開(kāi)源項(xiàng)目和前沿企業(yè)構(gòu)建系統(tǒng)的選擇,同時(shí)也在挑戰(zhàn)遺留的自動(dòng)化構(gòu)建項(xiàng)目。本demo主要講述如何用gradle構(gòu)建一個(gè)微服務(wù)項(xiàng)目。
閱讀本demo之前需要對(duì)Gradle有入門(mén)的了解,Gradle入門(mén)
Git地址
https://gitee.com/wqrzsy/lp-demo/tree/master/lp-springboot-gradle
更多demo請(qǐng)關(guān)注
springboot demo實(shí)戰(zhàn)項(xiàng)目
java 腦洞
java 面試寶典
開(kāi)源工具
項(xiàng)目分析
-
項(xiàng)目結(jié)構(gòu)
image.png
項(xiàng)目從根項(xiàng)目(lp-springboot-gradle)開(kāi)始包含一個(gè)組項(xiàng)目(lp-cms-group)
然后組項(xiàng)目下包含3個(gè)子項(xiàng)目(lp-dialog, lp-proto, lp-service-one)

然后我們留意到每個(gè)項(xiàng)目底下都會(huì)有一個(gè)build.gradle的文件,這個(gè)就是項(xiàng)目的gradle構(gòu)建文件
- rootProject
首先我們從根節(jié)點(diǎn)開(kāi)始, lp-springboot-gradle的build.gradle文件
apply from: "config.gradle"
group = 'wqr'
version = '0.0.1-SNAPSHOT'
//allprojects里是項(xiàng)目本身需要的依賴(lài),比如項(xiàng)目依賴(lài)springboot,就是在這里配置的
allprojects {
//如果要讓Gradle自動(dòng)生成Intellij的項(xiàng)目文件
apply plugin: "idea"
// 定義maven倉(cāng)庫(kù)
repositories {
mavenLocal()
maven {
// 這里mavenURL 是配置在config.gradle中
url mavenURL
}
mavenCentral()
}
//添加 utf-8 的支持,避免中文注釋生成 Javadoc 文件出現(xiàn)編碼錯(cuò)誤
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
// 自定義task任務(wù),遍歷子項(xiàng)目,打印子項(xiàng)目信息
tasks.create('printProjectInfo') {
doLast {
task ->
println "project name is $task.project.name, version = $task.project.version, group = $task.project.group "
}
}
}
def noJavaProjectNames = [
'lp-cms-group'
]
// subProjects 和 allProjects 一樣,只是subProjects 定義的是子項(xiàng)目,配置在本項(xiàng)目不會(huì)生效,
// allProject 是子項(xiàng)目和本項(xiàng)目都會(huì)生效
subprojects {
//buildscript里是gradle腳本執(zhí)行所需依賴(lài),分別是對(duì)應(yīng)的maven庫(kù)和插件
buildscript {
// 定義gradle 依賴(lài)的倉(cāng)庫(kù)
repositories {
mavenLocal()
maven { url mavenURL }
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
}
//gradle 依賴(lài)的插件
dependencies {
// springboot 插件
classpath "org.springframework.boot:spring-boot-gradle-plugin:${vers.springBoot}"
// gradle 工具插件
classpath "gradle.plugin.com.github.viswaramamoorthy:gradle-util-plugins:0.1.0-RELEASE"
//縮短命令行長(zhǎng)度
classpath "gradle.plugin.ua.eshepelyuk:ManifestClasspath:1.0.0"
}
}
// 排除組項(xiàng)目,因?yàn)榻M項(xiàng)目不是標(biāo)準(zhǔn)java項(xiàng)目
if (!noJavaProjectNames.contains(project.name)) {
apply plugin: "java" // 使用java插件構(gòu)建標(biāo)準(zhǔn)java工程
apply plugin: "maven" // 使用maven 倉(cāng)庫(kù)
apply plugin: 'groovy'//使用 groovy 插件構(gòu)建項(xiàng)目
//設(shè)置jdk的版本
sourceCompatibility = vers.jdk
targetCompatibility = vers.jdk
}
}
// idea的配置
idea {
module {
// 是否下載源碼
downloadSources = true
}
project {
jdkName = vers.jdk
languageLevel = vers.jdk
}
}
這里講述下
apply from: "config.gradle"
apply from 表示引入文件,這里就是引入一個(gè)"config.gradle"的文件
config.gradle 是一份自定義全局配置文件,定義全局屬性
ext {
mavenURL = 'http://maven.aliyun.com/nexus/content/groups/public/'
/**
* 全局版本
*/
vers = [
project : '1.0',
jdk : '11',
springBoot : '2.1.5.RELEASE',
springCloud : 'Greenwich.SR1',
jwt : '3.8.1',
swagger2 : '2.9.2',
grpc : '1.20.0',
protobuf : '3.6.1',
grpcStarter : '2.4.0.RELEASE',
commonsLang3: '3.9',
commonsCodec: '1.11',
commonsPool2: '2.6.1',
redisson : '3.10.6',
]
/**
* 全局依賴(lài)
*/
allDependsMap = [
// spring
'spring-boot-starter-web' : "org.springframework.boot:spring-boot-starter-web",
'spring-retry' : "org.springframework.retry:spring-retry",
'spring-boot-configuration-processor' : "org.springframework.boot:spring-boot-configuration-processor",
'spring-boot-starter-actuator' : "org.springframework.boot:spring-boot-starter-actuator",
'spring-boot-starter-data-jpa' : "org.springframework.boot:spring-boot-starter-data-jpa",
'spring-cloud-starter-openfeign' : "org.springframework.cloud:spring-cloud-starter-openfeign",
'spring-cloud-starter-config' : "org.springframework.cloud:spring-cloud-starter-config",
'spring-cloud-starter-netflix-eureka-client': "org.springframework.cloud:spring-cloud-starter-netflix-eureka-client",
'spring-cloud-starter-netflix-ribbon' : "org.springframework.cloud:spring-cloud-starter-netflix-ribbon",
'spring-cloud-starter-zipkin' : "org.springframework.cloud:spring-cloud-starter-zipkin",
'spring-boot-starter-data-redis' : "org.springframework.boot:spring-boot-starter-data-redis",
'spring-boot-starter-test' : "org.springframework.boot:spring-boot-starter-test",
'spring-boot-starter-security' : "org.springframework.boot:spring-boot-starter-security",
'spring-cloud-config-server' : "org.springframework.cloud:spring-cloud-config-server",
'spring-cloud-starter-netflix-eureka-server': "org.springframework.cloud:spring-cloud-starter-netflix-eureka-server",
'spring-cloud-starter-gateway' : "org.springframework.cloud:spring-cloud-starter-gateway",
// 雜
'spring-boot-admin-starter-server' : "de.codecentric:spring-boot-admin-starter-server:2.1.5",
'springfox-swagger2' : "io.springfox:springfox-swagger2:${vers.swagger2}",
'springfox-swagger-ui' : "io.springfox:springfox-swagger-ui:${vers.swagger2}",
'mysql-connector-java' : "mysql:mysql-connector-java",
'redisson' : "org.redisson:redisson:${vers.redisson}",
'kryo-shaded' : "com.esotericsoftware:kryo-shaded:4.0.2",
'grpc-spring-boot-starter' : "net.devh:grpc-spring-boot-starter:${vers.grpcStarter}",
'brave-instrumentation-grpc' : "io.zipkin.brave:brave-instrumentation-grpc:5.6.3",
// 工具
'guava' : "com.google.guava:guava:27.0.1-jre",
'commons-lang3' : "org.apache.commons:commons-lang3:${vers.commonsLang3}",
'commons-codec' : "commons-codec:commons-codec:${vers.commonsCodec}",
'commons-pool2' : "org.apache.commons:commons-pool2:${vers.commonsPool2}",
'java-jwt' : "com.auth0:java-jwt:${vers.jwt}",
'freemarker' : "org.freemarker:freemarker:2.3.23",
// javax
'jaxb-api' : "javax.xml.bind:jaxb-api:2.3.1",
'javax.annotation-api' : "javax.annotation:javax.annotation-api:1.2",
'activation' : "javax.activation:activation:1.1.1",
'validation-api' : "javax.validation:validation-api:2.0.1.Final",
'jsr311-api' : "javax.ws.rs:jsr311-api:1.1.1",
'jaxb-impl' : "com.sun.xml.bind:jaxb-impl:2.3.2",
'jaxb-core' : "com.sun.xml.bind:jaxb-core:2.3.0.1",
'grpc-protobuf' : "io.grpc:grpc-protobuf:${vers.grpc}",
'grpc-stub' : "io.grpc:grpc-stub:${vers.grpc}",
'grpc-netty-shaded' : "io.grpc:grpc-netty-shaded:${vers.grpc}",
]
/**
* springboot組依賴(lài)
*/
bootDepends = [
allDependsMap.'spring-boot-starter-web',
allDependsMap.'spring-retry',
allDependsMap.'spring-boot-configuration-processor',
allDependsMap.'spring-boot-starter-actuator',
allDependsMap.'springfox-swagger2',
allDependsMap.'springfox-swagger-ui',
]
/**
* common組依賴(lài)
*/
commonDepends = [
allDependsMap.'validation-api',
allDependsMap.'jsr311-api',
allDependsMap.'validation-api',
allDependsMap.'guava',
allDependsMap.'commons-lang3',
allDependsMap.'commons-codec',
allDependsMap.'java-jwt',
]
/**
* springboot-test組依賴(lài)
*/
bootTestDepends = [
allDependsMap.'spring-boot-starter-test',
]
}
這里我們看到全局依賴(lài)中的版本號(hào)是${vers.grpc},這種表示引用配置屬性,這個(gè)屬性的值在vers 中定義了,
然后我們也看到類(lèi)似org.springframework.boot:spring-boot-starter-web這種是沒(méi)配版本號(hào),這因?yàn)槲覀円肓薸o.spring.dependency-management插件,使用了這插件在聲明依賴(lài)的時(shí)候可以忽略掉版本號(hào)
- 接下來(lái)說(shuō)一下組項(xiàng)目的grade文件
首先說(shuō)一下組是什么,組是管理子項(xiàng)目的父級(jí)項(xiàng)目,所以組項(xiàng)目本身不是標(biāo)準(zhǔn)java項(xiàng)目,主要用于定義子項(xiàng)目的統(tǒng)一參數(shù)
group 'wqr'
version '0.0.1-SNAPSHOT'
// 定義非springboot 項(xiàng)目
def noBootJavaProjectNames = [
'lp-proto',
'lp-dialog'
]
subprojects {
// project.name 獲取子項(xiàng)目名字
// project.group 獲取子項(xiàng)目group
String name = project.name
//使用這個(gè)插件可以讓減少項(xiàng)目的改動(dòng)。而且,會(huì)檢測(cè)其他插件的使用或者更新。比如,當(dāng)應(yīng)用了java插件,會(huì)自動(dòng)在構(gòu)建時(shí)打包成可執(zhí)行的jar。
apply plugin: 'org.springframework.boot'
//允許你在聲明依賴(lài)的時(shí)候忽略掉版本號(hào),使用這項(xiàng)功能,只需要正常的聲明依賴(lài),不用寫(xiě)版本號(hào)就可以了
apply plugin: 'io.spring.dependency-management'
// 定義子項(xiàng)目依賴(lài)
dependencies {
// 定義在config.gradle中
compile bootDepends
testImplementation bootTestDepends
}
// 引入spring-cloud 依賴(lài)
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${vers.springCloud}"
}
}
// 排除不是springboot項(xiàng)目
if (noBootJavaProjectNames.contains(project.name)) {
// 取消springboot 打包過(guò)程
bootJar {
// springboot 打包過(guò)程, 需要Main函數(shù)
enabled = false
}
// 執(zhí)行階段
jar {
// 普通jar包,不需要main函數(shù)
// 是否禁止階段
enabled = true
}
} else {
bootJar {
// springboot 打包過(guò)程, 需要Main函數(shù)
enabled = true
}
// 執(zhí)行階段
jar {
// 普通jar包,不需要main函數(shù)
// 是否禁止階段
enabled = false
}
}
}
- 子項(xiàng)目的gradle文件
最后就是具體業(yè)務(wù)的微服gradle文件,該文件構(gòu)建只需考慮業(yè)務(wù)項(xiàng)目所需的配置和依賴(lài),比如在lp-service-one中做的jar包瘦身配置
group 'wqr'
version '0.0.1-SNAPSHOT'
// 定義項(xiàng)目依賴(lài)
dependencies {
// 定義在config.gradle中
compile allDependsMap.'mysql-connector-java'
}
// 清除現(xiàn)有的lib目錄
task clearJar(type: Delete) {
delete "$buildDir\\libs\\lib"
}
// 將依賴(lài)包復(fù)制到lib目錄
task copyJar(type: Copy, dependsOn: 'clearJar') {
// 復(fù)制文件
from configurations.compileClasspath
// 若文件夾不存在會(huì)自己創(chuàng)建
into "$buildDir\\libs\\lib"
}
// springboot打包過(guò)程
bootJar {
// 排除所有的jar
excludes = ["*.jar"]
// 執(zhí)行l(wèi)ib目錄的清除和復(fù)制任務(wù)
dependsOn clearJar
dependsOn copyJar
// 指定依賴(lài)包的路徑
manifest {
attributes "Manifest-Version": 1.0,
'Class-Path': configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ')
}
}
-
settings.gradle是定義父子項(xiàng)目關(guān)系的gradle文件
image.png
rootProject.name = 'lp-springboot-gradle'
include ':lp-cms-group'
include ':lp-cms-group:lp-service-one'
include ':lp-cms-group:lp-proto'
include ':lp-cms-group:lp-dialog'
項(xiàng)目擴(kuò)展
protobuf項(xiàng)目的gradle配置, lp-proto
-
啟動(dòng)含圖形界面的task的gradle配置,lp-dialog
image.png springboot 瘦身的gradle配置, lp-service-one
demo項(xiàng)目導(dǎo)入
參考: http://m.itdecent.cn/p/cd0275a2f5fb
如果這篇文章對(duì)你有幫助請(qǐng)給個(gè)star



