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