1. Gradle 简介

    Gradle 是一个开源自动化构建工具,它的核心基于 Groovy 的丰富而可扩展的域描述语言(DSL),而不是基于可扩展的标记语言(XML)来定义构建脚本。

    Groovy 通过声明性的语言元素将基于声明的构建推向下层,可以按想要的方式进行组合。这些元素同样也为支持 Java, Groovy,OSGi,Web 和 Scala 项目提供了基于约定的构建,并且这种声明性的语言是可以扩展的,可以添加新的或增强现有的语言元素。

    Gradle 是 Android 的官方构建工具,它提供了与多种开发工具和服务器的集成,包括 Eclipse,IntelliJ,Jenkins 和Android Studio。

    Gradle 的一些独特功能如下:

        (1) 支持声明式构建和按惯例构建;
        (2) 它支持用于基于依赖项编程的语言;
        (3) 为项目提供了结构化的构建。

    Gradle 与 Maven 的不同之处:

        (1) 灵活性

            Google 选择 Gradle 作为 Android 官方构建工具,不是因为它的构建脚本是 Groovy代码,而是因为 Gradle 是以一种最基本的可扩展的方式建模的。Gradle 的模型还允许使用 C/C++ 进行本地开发,并且可以扩展到其他生态系统,例如,Gradle 的设计考虑了使用它的 Tooling API 进行嵌入。

            Gradle 和 Maven 都提供了约定优于配置的概念。Maven 提供了一个非常严格的模型,使得定制变得乏味,有时甚至变得不可能,尽管这让你更容易理解任何给定的构建,但只要你没有任何特别的要求,它也不适合处理许多自动化问题。另一方面,Gradle 是在充分授权和负责任的用户基础上构建的。

        (2) 性能

            减少构建时间是加快交付速度最直接的方式之一。Gradle 和Maven 都采用某种形式的并行项目构建和依赖解析,最大的区别在于 Gradle 的工作回避与增量机制。Gradle 比 Maven 快的最主要的三个特性:

                a) 增量工作方式。Gradle 通过跟踪任务的输入输出来避免不必要的工作,并且只处理可能被更改的文件;
                b) 构建缓存。对于具有相同输入的构建,可以复用其他构建的输出,即使是在不同的机器上;
                c) Gradle 的守护进程。在内存中长期驻守一个进程来保持热点构建信息。
                d) 在 Gradle 与 Maven 的性能对比中,以上这些以及其他一些特性使得 Gradle 几乎在每个场景中都性能都要高一倍,对于使用的构建缓存的大型构建,性能甚至要高 100 倍。

        (3) 用户体验

            Maven 由于对 IDE 的友好支持,使得其在用户中有广泛的使用。但是,Gradle 也在不断完善对各种IDE的支持,例如,Gradle 有基于Kotlin 的 DSL,提供了更好的 IDE 体验。Gradle 团队正在与 IDE 开发商合作,以提供更好的编辑支持,请关注这里。

            尽管 IDE 很重要,仍然有很多用户喜欢使用命令行来构建,Gradle 提供了一个现代的命令行工具,它具有可发现功能,如 gradle tasks,以及改进的日志记录和命令补全功能。

            最后,Gradle 提供了一个可交互的 Web UI(build scans),用于调试和优化构建。这些也可以在内部托管,以允许团队收集构建历史,分析构建趋势,比较构建进行调试和优化构建时间。

        (4) 依赖管理

            Gradle 和 Maven 都内建了从配置仓库解析依赖关系的功能,都能将依赖项缓存到本地并且可以并行下载。

            作为库消费者,Maven 允许覆盖依赖项,但只能根据依赖项的版本来覆盖。Gradle 提供了可自定义的选择和替换规则,这意味着,我们在项目中只需要声明一次就可以全局排除不想要的依赖项,这种机制使得 Gradle 可以完成包含多个项目的复合构建。

            Maven 几乎没有内置的依赖范围管理,这使得在测试或生成代码等常见场景中的模块结构不够友好,比如,单元测试和继承测试之间没有分离。Gradle 支持自定义依赖范围,这提供了更好的模块结构和更快的构建。

            作为库生产者,Gradle 允许生产者声明 api 和 implementation 之间的依赖关系,以避免不需要的库泄漏到消费者的 classpath 中。Maven 则是允许发布者通过可选的依赖项提供元数据。

    Gradle: https://gradle.org/
    Gradle GitHub: https://github.com/gradle/gradle

 

2. Gradle 安装配置

    本文主要描述 Gradle 作为 Java 项目的构建工具,因此最基本的要求是在计算机上安装 JDK 7.0 及以上。

    1) Windows 下安装

        Windows版本: Windows 10 Home (20H2)

        下载:https://services.gradle.org/distributions/gradle-7.0-bin.zip

        下载后解压缩,无需安装,只需配置。假设 Gradle 相关的目录如下:

            Gradle 目录: C:\Applications\Java\gradle-7.0

        (1) 配置环境变量

            右击“我的电脑” → “属性” → “高级系统设置” → “高级” → “环境变量”

            新建系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”)

                GRADLE_HOME = C:\Applications\Java\gradle-7.0

                GRADLE_USER_HOME = C:\Applications\Java\gradle-rep

            编辑系统变量 Path (PATH)

                Path = … ;%GRADLE_HOME%\bin;

        (2) 修改成阿里源

            在目录 C:\Applications\Java\gradle-7.0\init.d,添加一个文件 init.gradle,添加以下内容

复制代码

                allprojects {
                    repositories {
                        maven { url 'file:///C:/Applications/Java/gradle-rep'}
                        mavenLocal()
                        maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
                        mavenCentral()
                    }

                    buildscript {
                        repositories {
                            maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
                            maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
                        }
                    }
                }

复制代码

            maven { url 'file:///C:/Applications/Java/gradle-rep'} 配置的是 Gradle 本地仓库或工作目录的地址,对应 GRADLE_USER_HOME。

     2) macOS 下安装

        macOS版本: macOS High Sierra (Version: 10.13.6)

        下载:https://services.gradle.org/distributions/gradle-7.0-bin.zip

        下载后解压缩,无需安装,只需配置。假设 Gradle 相关的目录如下:

            Gradle 目录: /Users/xxx/Applications/Java/gradle-7.0

        (1) 配置环境变量

            修改系统配置文件 /etc/profile

复制代码

                $ sudo vim /etc/profile

                    ...

                    GRADLE_HOME=/Users/xxx/Applications/Java/gradle-7.0
                    CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
                    PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$GRADLE_HOME/bin
                    export JAVA_HOME JRE_HOME GRADLE_HOME CLASS_PATH PATH
                
                $ source /etc/profile
                $ echo $GRADLE_HOME

复制代码

       (2) 修改成阿里源

            在目录 /Users/xxx/Applications/Java/gradle-7.0/init.d,添加一个文件 init.gradle,添加以下内容

复制代码

                allprojects {
                    repositories {
                        maven { url 'file:////Users/xxx/Applications/Java/gradle-rep'}
                        mavenLocal()
                        maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
                        mavenCentral()
                    }

                    buildscript {
                        repositories {
                            maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
                            maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
                        }
                    }
                }

复制代码

            maven { url 'file:////Users/xxx/Applications/Java/gradle-rep'} 配置的是 Gradle 本地仓库或工作目录的地址,对应 GRADLE_USER_HOME。

    3) Linux 下安装

        参考 macOS 下安装

 

3. 创建 Java 项目

    如何使用 gradle init 创建带有 Gradle 的 Java 应用程序,可以按照如下步骤进行。

    1) gradle init 项目

        在 D:\Workshop\demos 目录中下创建一个目录 GradleDemo01,运行如下命令:

复制代码

            D:\Workshop\demos\GradleDemo01> gradle init

              Welcome to Gradle 7.0!

              Here are the highlights of this release:
               - Added support for Java 19.
               - Introduced `--rerun` flag for individual task rerun.
               - Improved dependency block for test suites to be strongly typed.
               - Added a pluggable system for Java toolchains provisioning.

              For more details see https://docs.gradle.org/7.0/release-notes.html

              Starting a Gradle Daemon (subsequent builds will be faster)

              Select type of project to generate:
                1: basic
                2: application
                3: library
                4: Gradle plugin
              Enter selection (default: basic) [1..4] 2

              Select implementation language:
                1: C++
                2: Groovy
                3: Java
                4: Kotlin
                5: Scala
                6: Swift
              Enter selection (default: Java) [1..6] 3

              Split functionality across multiple subprojects?:
                1: no - only one application project
                2: yes - application and library projects
              Enter selection (default: no - only one application project) [1..2] 1

              Select build script DSL:
                1: Groovy
                2: Kotlin
              Enter selection (default: Groovy) [1..2] 1

              Generate build using new APIs and behavior (some features may change in the next minor release)? (default: no) [yes, no]

              Select test framework:
                1: JUnit 4
                2: TestNG
                3: Spock
                4: JUnit Jupiter
              Enter selection (default: JUnit Jupiter) [1..4]

              Project name (default: GradleDemo01):
              Source package (default: gradledemo01): com.example

              > Task :init
              Get more help with your project: https://docs.gradle.org/7.0/samples/sample_building_java_applications.html

              BUILD SUCCESSFUL in 1m 46s
              2 actionable tasks: 2 executed

复制代码

        命令运行后,D:\Workshop\demos\GradleDemo01 目录下自动生成了一个基于 Groovy 的带 JUnit 4 测试框架的 Java Application 项目 GradleDemo01。

    2) 项目目录结构

复制代码

        GradleDemo01
            |- app
            |   |- build.gradle
            |   |- src
            |       |- main
            |       |    |- java
            |       |         |- com
            |       |             |- example
            |       |                   |- App.java
            |       |- test
            |            |- java
            |                 |- com
            |                     |- example
            |                           |- AppTest.java
            |- gradle
            |   |- wrapper
            |       |- gradle-wrapper.jar
            |       |- gradle-wrapper.properties
            |
            |- settings.gradle
            |- gradlew
            |- gradlew.bat

复制代码

 

        (1) 目录及文件说明:
        
            GradleDemo01:项目名,包含 app 文件夹、gradle 文件夹、settings.gradle、gradlew 和 gradlew.bat;
            app/build.gradle: app 构建文件;
            app/src/main/java:用于存放项目的 Java 文件;
            app/src/test/java:用于存放所有测试 Java 文件,如 JUnit 测试类;
            gradle:Gradle wrapper 的 jar 文件和配置文件;
            gradlew, gradlew.bat: Gradle wrapper 启动脚本;
            settings.gradle:Gradle 项目核心配置文件。

        (2) app/src/main/com/example/App.java 文件

复制代码

            package com.example;            public class App {                public String getGreeting() {                    return "Hello World!";
                }                public static void main(String[] args) {
                    System.out.println(new App().getGreeting());
                }
            }

复制代码

        (3) app/src/test/com/example/TestApp.java 文件

复制代码

            package com.example;            import org.junit.Test;            import static org.junit.Assert.*;            public class AppTest {
                @Test public void appHasAGreeting() {
                    App classUnderTest = new App();
                    assertNotNull("app should have a greeting", classUnderTest.getGreeting());
                }
            }

复制代码

        (4) app/build.gradle 文件

复制代码

            plugins {
                // Apply the application plugin to add support for building a CLI application in Java.
                id 'application'
            }

            repositories {
                // Use Maven Central for resolving dependencies.
                mavenCentral()
            }

            dependencies {
                // Use JUnit test framework.
                testImplementation 'junit:junit:4.13.2'

                // This dependency is used by the application.
                implementation 'com.google.guava:guava:31.1-jre'
            }

            application {
                // Define the main class for the application.
                mainClass = 'com.example.App'
            }

复制代码

        (5) settings.gradle 文件

            rootProject.name = 'GradleDemo01'
            include('app')

    3) 运行

        D:\Workshop\demos\GradleDemo01> gradlew.bat run

            Starting a Gradle Daemon (subsequent builds will be faster)

            > Task :app:run
            Hello World!

            BUILD SUCCESSFUL in 5s
            2 actionable tasks: 2 executed

    4) 打包

        D:\Workshop\demos\GradleDemo01> gradlew.bat build

            BUILD SUCCESSFUL in 2s
            7 actionable tasks: 6 executed, 1 up-to-date

        生成的文件在 app/build 目录下。

转自:https://www.cnblogs.com/tkuang/p/17187767.html