概述

gradle:项目构建工具

gradle 相关网址:

下载安装

1、下载:选择 binary-only 即可

image.png

2、gradle 配置:在 Windows 的当前用户的系统变量中设置相应的属性

  • 新建 GRADLE_HOME 属性,值为 gradle 解压目录
  • 在 path 属性中新增:%GRADLE_HOME%\bin
  • 新增 GRADLE_USER_HOME 属性,值为 maven 仓库的地址,这样就可以让 gradle 使用 maven 仓库

gradle 安装测试:【Win + R】打开运行,输入 cmd ,回车,在 cmd 控制台上输入【gradle -v】

依赖管理

为 Java 项目指定依赖项需要以下三个信息:

  • 需要哪个依赖项,例如名称和版本
  • 用在什么地方,编译或运行
  • 在哪些寻找
  1. // build.gradle
  2. repositories {
  3. mavenLocal()
  4. maven {
  5. url "https://maven.aliyun.com/repository/public"
  6. }
  7. mavenCentral()
  8. }
  9. dependencies {
  10. implementation 'org.hibernate:hibernate-core:3.6.7.Final'
  11. }

三个元素的 gradle 术语:

  • repositories:存储库,在哪里查找依赖项
  • dependencies:需要导入的依赖项
    • implementation:配置项
    • 模块坐标:”group : module : version” 或 group,name,version

常见的配置项:

compile:被弃用,因为它不能区分影响 Java 库项目的公共 API 的依赖项和不影响 Java 库项目的公共 API 的依赖项

  • compileOnly:用于编译生产代码所必需的依赖关系,但不应该属于运行时类路径
  • implementation:取代 compile,用于编译和运行时
  • runtimeOnly:取代 runtime,仅在运行时使用,不用于编译
  • testCompileOnly:测试,相当于 compileOnly
  • testImplementation:测试,相当于 implementation
  • testRuntimeOnly:测试,相当于 runtimeOnly

编译代码

源代码集:主要思想是源文件和资源通常按类型进行逻辑分组,例如应用程序代码、单元测试和集成测试,每个逻辑组通常都有自己的文件依赖项集、类路径中,最重要的是,构成源集的文件不必位于同一目录中

源集能够将编译的几个方面联系在一起:

  • 源文件及其位置
  • 编译类路径,包括任何必须的依赖项
  • 放置已经编译的类文件的位置

gradle 使用 - 图2

gradle 代码约定:

  • src/main/java:生产源代码目录
  • src/main/resources:正式配置文件目录
  • src/test/java:单元测试代码目录
  • src/test/resources:测试配置文件目录
  • src/main/webapp:放置页面元素,如 js、css、img、jsp等

自定义文件和目录位置:

  • 每个源集都定义其源代码所在的位置,以及类文件的资源和输出目录,可以通过以下语法进行覆盖

    1. sourceSets {
    2. main {
    3. java {
    4. srcDirs = ['src']
    5. }
    6. }
    7. test {
    8. java {
    9. srcDirs = ['test']
    10. }
    11. }
    12. }
  • 如果不想覆盖预定,而是只想添加一个额外的源目录,则使用如下声明

    1. sourceSets {
    2. main {
    3. java {
    4. srcDir 'thirdParty/src/main/java'
    5. }
    6. }
    7. }

    gradle 常见约定:设置属性将替换值,而相应的方法会附加值

gradle 构建基础

gradle 的两个基本概念:projects(项目)、tasks(任务)

  • 每一个构建都由一个或多个 projects 组成,一个 project 可以代表什么取决于你想利用 gradle 做什么,比如一个 project 可以代表一个要构建的某个东西,如一个 jar 或者一个要发布的 zip 压缩包;也可以代表一件准备要做的事,比如部署应用
  • 每一个 project 由一或多个 task 组成,一个 task 代表一些更加精细化的构建

可以通过 gradle 命令运行一个 gradle 构建:

  • gradle 命令会在当前目录查找一个叫 build.gradle 的文件(构建配置脚本)

java 插件

  1. apply plugin: 'java'
  • gradle tasks:列出项目的所有任务
  • gradle build:创建一个包含类和资源的 JAR 文件
  • gradle clean:删除 build 生成的目录和所有生成的文件
  • gradle assemble:编译并打包代码(并不运行单元测试)
  • gradle check:编译并测试你的代码

定制 MANIFEST.MF 文件:

  1. sourceCompatibility = 1.8
  2. targetCompatibility = 1.8
  3. version = '1.0'
  4. jar {
  5. manifest {
  6. attributes "group":"name":"version"
  7. }

使用 UTF-8 编码:

  1. // UTF-8
  2. tasks.withType(JavaCompile) {
  3. options.encoding = "UTF-8"
  4. }

buildscript、subprojects 和 allprojects

1、buildscript {} 块:用来加载 gradle 脚本自身需要使用的资源,可以声明的资源包括依赖项、第三方插件、maven 仓库地址等

  • buildscript {} 块中的 repositories:为了 gradle 脚本自身的执行,获取脚本依赖插件

2、根级别的 repositories :用于为当前项目提供所需的依赖包,如 log4j 等依赖可以从 mavenCentral 获得

3、allprojects 块的 repositories 用于多项目构建,为所有项目(包括根项目)提供共同的所需依赖包,同时,子项目可以配置自己的 repositories 以获取自己独需的依赖包

4、subprojects 块的 repositories 用于配置这个项目的所有子项目,用于抽取子项目的相同配置,在需要时进行配置注入,避免重复配置。根项目就像一个容器, subprojects 方法遍历这个容器的所有元素并且注入指定的配置

allprojects 和 subprojects 的区别:

  • allprojects:对所有项目的配置,包括 Root Project
  • subprojects:对所有子项目的配置

gradle 的 plugins {} 和 apply plugin

gradle 官方插件库:https://plugins.gradle.org/
1、plugins {} 块这种方式引入的插件来自 Gradle 官方插件库,gradle 2.1版本以上可用
2、buildscript {} 块指定第三方库作为 gradle 插件,指定插件就需要使用 apply plugin

  1. // plugins {}:使用官方的插件库
  2. plugins {
  3. id 'org.springframework.boot' version '2.2.2.RELEASE'
  4. }
  5. // 使用第三方库
  6. buildscript {
  7. // 指定仓库地址
  8. repositories {
  9. maven {
  10. url "https://plugins.gradle.org/m2/"
  11. }
  12. }
  13. // 指定依赖
  14. dependencies {
  15. classpath "org.springframework.boot:spring-boot-gradle-plugin:2.2.2.RELEASE"
  16. }
  17. }
  18. // 导入插件
  19. apply plugin: "org.springframework.boot"

gradle 使用

多项目构建:
1、定义一个多项目构建工程需要在根目录创建一个 setting 配置文件来指明构建包含哪些项目,并且这个文件必须叫 settings.gradle:

  1. include "shared","api"

2、公共配置:对多项目构建而言,总有一些共同的配置,在根项目上采用配置注入的发过誓定义一些公共配置;根项目就像一个容器,子项目会迭代访问它的配置并注入到自己的配置中

  1. buildscript {
  2. /**
  3. * 指定所使用的仓库
  4. * mavenLocal()从本地仓库导入
  5. * maven() {url("https://maven.aliyun.com/repository/public")} 指定国内镜像,加快下载速度
  6. * mavenCentral()表示使用中央仓库,此刻项目中所需要的jar包都会默认从中央仓库下载到本地指定目录
  7. */
  8. repositories {
  9. mavenLocal()
  10. maven() {
  11. url("https://maven.aliyun.com/repository/public")
  12. }
  13. mavenCentral()
  14. }
  15. // 定义变量
  16. ext {
  17. springBootVersion = '2.4.1'
  18. }
  19. dependencies {
  20. classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
  21. }
  22. }
  23. subprojects {
  24. group 'top.songfang'
  25. version '1.0-SNAPSHOT'
  26. apply plugin: 'java'
  27. apply plugin: 'io.spring.dependency-management'
  28. apply plugin: 'org.springframework.boot'
  29. repositories {
  30. mavenLocal()
  31. maven() {
  32. url("https://maven.aliyun.com/repository/public")
  33. }
  34. mavenCentral()
  35. }
  36. dependencies {
  37. /**
  38. * gradle工程的所有jar包的坐标都在dependencies属性内放置
  39. * 每一个jar包的坐标都有三个基本元素组成
  40. * group、name、version
  41. * testCompile 表示该jar包在测试的时候起作用,该属性为jar包的作用域
  42. * 在gradle里面添加坐标的时候都要带上jar包的作用域
  43. */
  44. compile 'org.springframework.boot:spring-boot-starter-web'
  45. annotationProcessor 'org.projectlombok:lombok:1.18.16'
  46. compileOnly 'org.projectlombok:lombok:1.18.16'
  47. }
  48. }

dependency-management-plugin

官方文档:https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/

dependency-management-plugin:一个 gradle 插件,提供类似 Maven 的依赖项管理和排除

根据配置的依赖项管理元数据,“依赖项管理插件”将控制项目的直接和传递依赖项的版本,并将遵守项目依赖项的 poms 中声明的所有排除项。

插件要求:

  • gradle 2.9以上
  • java 6以上

获取:
1、从 gradle 官方插件库获取

  1. plugins {
  2. id "io.spring.dependency-management" version "1.0.10.RELEASE"
  3. }

2、从 Maven Center 或 JCenter 仓库中获取

  1. buildscript {
  2. repositories {
  3. // 国内建议使用镜像站
  4. maven { url 'https://maven.aliyun.com/repository/public' }
  5. maven { url 'https://repo.spring.io/plugins-snapshot' }
  6. }
  7. dependencies {
  8. classpath 'io.spring.gradle:dependency-management-plugin:1.0.7.BUILD-SNAPSHOT'
  9. }
  10. }
  11. apply plugin: "io.spring.dependency-management"