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