Gradle

​ Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。

​ 面向Java应用为主。当前其支持的语言限于Java、GroovyKotlinScala,计划未来将支持更多的语言。

1 简介

​ Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。

Groovy

​ Gradle 的构建脚本是采用 Groovy 写的,而不是用 XML。 但与其他方法不同,它并不只是展示了由一种动态语言编写的原始脚本的强大。 那样将导致维护构建变得很困难。 Gradle 的整体设计是面向被作为一门语言,而不是一个僵化的框架。 并且 Groovy 是我们允许你通过抽象的 Gradle 描述你个人的 story 的黏合剂。 Gradle 提供了一些标准通用的 story。这是我们相比其他声明性构建系统的主要特点。 我们的 Groovy 支持也不是简单的糖衣层,整个 Gradle 的 API 都是完全 groovy 化的。只有通过 Groovy才能去运用它并对它提高效率。

为什么使用 Groovy?

​ 我们认为内部 DSL(基于一种动态语言)相比 XML 在构建脚本方面优势非常大。它们是一对动态语言。 为什么使用 Groovy?答案在于 Gradle 内部的运行环境。 虽然 Gradle 核心目的是作为通用构建工具,但它还是主要面向 Java 项目。 这些项目的团队成员显然熟悉 Java。我们认为一个构建工具应该尽可能地对所有团队成员透明。

2 Gradle构建Spring Boot

Gradle相关知识还是比较多的,本文就不从理论等相关知识做讲解了,仅供快速整合使用Gradle来构建Java项目。由于本人在使用Gradle遇到很多问题,通过查阅大量文档最终整理出全面完善的东西。或许有些不足之处,望大家共同指正完善。谢谢~~

2.1 Gradle 依赖传递

​ 先说一下Gradle依赖传递问题吧,以免大家遇到跟我一样的困惑。通俗的说依赖传递就是当moduleA依赖moduleB的时候,需要使用到moduleB的依赖,就跟以下三种方式有关。

  • compile(implementation,api): 这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
  • implementation:该依赖方式所依赖的库不会传递,只会在当前module中生效。
  • api:该依赖方式会传递所依赖的库,当其他module依赖了该module时,可以使用该module下使用api依赖的库。

2.2 项目结构

​ 项目以微服务架构多模块分层,本文主要讲如何通过Gradle构建多模块项目。不去讲解项目的其他配置,和业务代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
├── micros-gradle-examples
│ ...
├── micros-core
│ ├── src
│ │ └──...
│ └── build.gradle
├── micros-gateway
│ ├── src
│ │ └──...
│ └── build.gradle
├── micros-services
│ └── micros-service-user
│ ├── src
│ │ └──...
│ └── build.gradle
│ └── build.gradle
├── micros-starters
│ └── micros-starter-mybatis
│ ├── src
│ │ └──...
│ └── build.gradle
│ └── build.gradle
├── build.gradle
├── gradle.properties
└── settings.gradle

2.3 结构分析

1. micros-gradle-examples

[根项目]

  • settings.gradle

    整个项目一个settings配置就够了。

1
2
3
4
5
6
rootProject.name = 'micros-gradle-examples'

include 'micros-core'
include 'micros-gateway'
include 'micros-services:micros-service-user'
include 'micros-starters:micros-starter-mybatis'
  • gradle.properties

    项目相关引用的依赖版本号配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
javaVersion=1.8
springBootVersion=2.3.3.RELEASE
springCloudVersion=Hoxton.SR8
springCloudAlibabaVersion=2.2.2.RELEASE
springIOVersion=1.0.11.RELEASE
commonsLang3Version=3.9
knife4jVersion=3.0.2
commonsIoVersion=2.6
ip2regionVersion=1.7.2
hutoolVersion=5.4.1
antisamyVersion=1.5.3
disruptorVersion=3.4.2
mybatisPlusVersion=3.3.2
  • build.gradle

    项目构建配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 项目编译
buildscript {
// Maven资源库
repositories {
maven { url 'https://maven.aliyun.com/repository/public' }
maven { url 'https://maven.aliyun.com/repository/spring-plugin' }
mavenCentral()
}
// springboot gradle 插件配置
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
// 所有项目
allprojects {
// 相关插件
// 版本管理插件
apply plugin: 'io.spring.dependency-management'
// idea插件
apply plugin: 'idea'
// Java插件
apply plugin: 'java-library'
// 项目信息
group = 'com.lmaye'
version = '1.0.1-SNAPSHOT'
// 编译版本
sourceCompatibility = "${javaVersion}"
targetCompatibility = "${javaVersion}"
// 编码
def encoding = "UTF-8"
compileJava.options.encoding = encoding
compileTestJava.options.encoding = encoding
// 解决Gradle编译时出现: 编码GBK的不可映射字符
//[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
tasks.withType(JavaCompile) {
options.encoding = encoding
}
// Maven资源库
repositories {
mavenLocal()
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
mavenCentral()
}
// 管理版本
dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-starter-parent:${springBootVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
}
}
}
// 顶级不打Jar包
jar.enabled = false
// 项目描述
description = "Microservice Examples project for Spring Boot"
1.1 micros-core

[子项目]项目核心依赖

  • build.gradle

    因为根项目很多已经引用,子项目可以直接继承。所以子项目配置相对可以简洁很多,需要发布到mavne资源库去的jar包添加相关插件,然后配置一下发布信息即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
// 项目依赖
dependencies {
compile 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
compile "com.google.code.gson:gson"
compile 'com.fasterxml.jackson.core:jackson-databind'
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8'
compile 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
compile 'org.springframework.boot:spring-boot-starter-validation'
compile 'com.fasterxml.jackson.module:jackson-module-parameter-names'
compile "cn.hutool:hutool-all:${hutoolVersion}"
compile "commons-io:commons-io:${commonsIoVersion}"
compile "org.lionsoul:ip2region:${ip2regionVersion}"
compile "org.owasp.antisamy:antisamy:${antisamyVersion}"
compile "org.apache.commons:commons-lang3:${commonsLang3Version}"
compile "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
}
// ------------------ 打包发布相关配置 ------------------
apply plugin: 'maven'
// 用于发布jar包到私服插件
apply plugin: 'maven-publish'

java {
withJavadocJar()
withSourcesJar()
}
// 禁用JavaDoc检查
tasks.withType(Javadoc).all { enabled = false }
// Java文档
javadoc {
if (JavaVersion.current().isJava9Compatible()) {
options.addBooleanOption('html5', true)
}
}
// 私服发布配置
publishing {
publications {
mavenJava(MavenPublication) {
groupId = project.group
artifactId = project.name
version = project.version
from components.java
}
}
// Maven资源库
repositories {
maven {
def releasesUrl = "http://192.168.30.241:8081/repository/maven-releases/"
def snapshotsUrl = "http://192.168.30.241:8081/repository/maven-snapshots/"
url = version.endsWith('SNAPSHOT') ? snapshotsUrl : releasesUrl
credentials {
username = 'admin'
password = 'admin123'
}
}
}
}
1.2 micros-services

​ 相对于最外层属于[子项目],但是它又属于微服务这层的根项目,所以配置就有subprojects作用于它的子级项目配置。

  • build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 子项目配置
subprojects {
apply plugin: 'org.springframework.boot'
// 项目依赖
dependencies {
implementation('org.springframework.boot:spring-boot-starter') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
implementation 'org.springframework.boot:spring-boot-starter-undertow'
implementation "com.lmax:disruptor:${disruptorVersion}"
implementation 'org.springframework.boot:spring-boot-starter-log4j2'
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
// 测试
test {
useJUnitPlatform()
}
// 解决: LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j
configurations.all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
}
}
// 顶级不打Jar包
jar.enabled = false
// 项目描述
description = "Microservice Services project for Spring Boot"
1.2.1 micros-service-user

[子项目]具体的用户微服务

  • build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
// 项目依赖
dependencies {
annotationProcessor 'org.projectlombok:lombok'
implementation project(':micros-core')
implementation project(':micros-starters:micros-starter-mybatis')
// Nacos
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
// 分库分表
implementation 'org.apache.shardingsphere:sharding-jdbc-spring-boot-starter:4.1.1'
}

配置还有一些,有了这些基本结构。对于更多模块化也能迎刃而解了。

3 项目源码

码云地址:micros-gradle-examples

最后更新: 2021年08月11日 00:35

原始链接: https://www.lmaye.com/2021/01/29/20210129145644/

× 多少都行~
打赏二维码