Gradle
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。
面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala,计划未来将支持更多的语言。
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
|
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 { repositories { maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/spring-plugin' } mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } }
allprojects { apply plugin: 'io.spring.dependency-management' apply plugin: 'idea' 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 tasks.withType(JavaCompile) { options.encoding = encoding } 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.enabled = false
description = "Microservice Examples project for Spring Boot"
|
1.1 micros-core
[子项目]
项目核心依赖
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'
apply plugin: 'maven-publish'
java { withJavadocJar() withSourcesJar() }
tasks.withType(Javadoc).all { enabled = false }
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 } } 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作用于它的子级项目配置。
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() } configurations.all { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } }
jar.enabled = false
description = "Microservice Services project for Spring Boot"
|
1.2.1 micros-service-user
[子项目]
具体的用户微服务
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') 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