Gradle 和 Maven 一样,都是一个项目依赖管理构建工具。
那为什么我们还要放弃Maven 改用Gradle 呢?
带着问题的答案我们来到了Gradle 官网,相信你会看到这样的界面:
翻译成中文就是
从移动应用程序到微服务,从小型创业公司到大型企业,Gradle可以帮助团队更快地构建,自动化和交付更好的软件。
- Gralde可以构建一切:
- 支持Java,C++,Python或自己开发的语言
- 用于在任何平台上部署的软件包。
- 进行单仓库或多仓库。
- 并依靠Gradle无与伦比的多功能性来构建所有组件。
- Gradle可以自动化一切
- 使用Gradle丰富的API和成熟的插件和集成生态系统来实现自动化方面的雄心勃勃。
- 从头到尾对您的软件交付进行建模,集成和系统化。
- 更快地交付
- 用优雅,快速的构建来扩展开发。
- 从避免编译到高级缓存等,我们不懈地追求性能,因此您的团队可以不断交付。
上面介绍了一些它的优点,接下来我们看看都谁在使用他们。
资料来源: top 20 open-source projects
我们可以看到著名的一些开源项目都在使用Gradle.
除此之外,主流的IDE 也都支持Gradle
另外,关于用户的好评也是不断,无论是Netflix 的高级开发工程师还是领英的高级工程师管理者都认为它很不错。
好了夸完了,我们来看看怎么安装Gradle.
当前Gradle 的最新版本是6.3, 关于下载方式根据不同操作系统不尽相同。
Gradle 官方下载地址https://gradle.org/releases/
这里提供了二进制和完整版下载,binary-only 是只包含二进制文件,complete 除了二进制之外还包括示例和文档。
一般不差那么点磁盘空间都会选择complete 版本.
如果是这种方式安装的话,无论是Windows 用户还是Mac OSX 用户都需要手动配置环境变量
- Windows 用户
- 新建配置环境变量
GRADLE_HOME C:/app/gradle/gradle-6.3
- 追加到PATH 环境变量
PATH:${GRADLE_HOME}/bin
- Mac OSX 用户
- 创建/opt/gradle文件夹
mkdir /opt/gradle
- 解压文件
unzip -d /opt/gradle gradle-6.3-bin.zip
- 查看当前路径下的文件列表
ls
- 安装环境变量
export PATH=$PATH:/opt/gradle/gradle-6.3/bin
Mac OSX 一般来说操作系统自带了HomeBrew 包管理器,因此安装一般使用包管理器方式进行安装。
安装命令如下所示:
brew install gradle
安装完成后我们一般需要验证我们的安装是否成功。
不管使用哪种方式进行安装,最终都可以输入命令验证是否安装成功
gradle -v
Gradle 不管运行在哪个系统都需要安装JDK 或JRE 支持,建议最好安装JDK 8+ 版本
验证JDK 是否输入如下命令
java -version
接下来我们针对Gradle 和Maven 做一个对比。
我们知道在Maven 中,拥有.m2 文件夹,所有的依赖都会默认下载到这个文件夹中。
/Users/zhaoqingfeng/.m2/repository/
在Gradle 中同样拥有.gradle 文件夹,所有的依赖都会下载到这个文件夹中。
/Users/zhaoqingfeng/.gradle/caches/modules-2/files-2.1
- clean 清理/target 文件夹下的资源
- compile 编译下载依赖
- test 执行JUnit 测试
- package 将项目打包成jar 或war
- verify 通常包括单元测试,任何静态分析任务(如Checkstyle)和其他任务
- install 安装到Maven本地仓库
- deploy 发布到远程仓库
build 是为项目下载关联依赖
将现有的Maven构建自动转换为Gradle方法非常简单只需要输入如下命令即可
gradle init
maven中需要输入如下命令为项目安装依赖:
mvn install
Gradle 中为项目下载依赖则需要输入如下命令:
gradle build
接下来我们学习下如何使用Gradle 声明各种类型的依赖。
之前的Maven 是这么声明一个依赖的
pom.xml 部分配置示例如下
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>2.13.1version>
dependency>
build.gradle 部分配置示例如下:
implementation 'log4j:log4j:1.2.12'
当然可能你还看过其他一些旧版本的其他写法,比如
旧版本写法一:compile group: 'org.apache.logging.log4j', name: 'log4j-core',version: '2.13.1'
旧版本写法二:
dependencies { compile 'log4j:log4j:1.2.12' }
在maven 中,我们引入一个运行时有效的依赖是这么操作的。
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
在gradle 中如果是普通运行时依赖需要这么做:
dependencies {
runtimeOnly 'mysql:mysql-connector-java'
}
如果是仅用于测试范围的运行时依赖则需要这么做
dependencies {
testRuntimeOnly 'mysql:mysql-connector-java'
}
如果是测试和编译范围的依赖
dependencies {
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
在Maven中声明排除依赖是这么做的:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>
在Gradle中声明测试依赖需要这么做:
dependencies {
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
在maven中
<dependency>
<groupId>javax.servletgroupId>
<artifactId>servlet-apiartifactId>
<version>2.5version>
<scope>providedscope>
dependency>
在Gradle中则是
providedCompile group: 'javax.servlet', name: 'servlet-api', version: '2.5'
如果只是在运行范围内的provided依赖
providedRuntime group: 'javax.servlet', name: 'servlet-api', version: '2.5'
maven中声明插件是这么做的
<plugin>
<groupId>com.google.cloud.toolsgroupId>
<artifactId>jib-maven-pluginartifactId>
<version>2.1.0version>
plugin>
gradle 声明插件方式比较简单直接:
plugins {
id 'java'
id 'com.google.cloud.tools.jib' version '1.8.0'
}
一个完整示例如下:
build.gradle
plugins {
id 'java'
id 'org.jetbrains.intellij' version '0.4.18'
}
group 'com.xingyun'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
maven {
url "https://maven.aliyun.com/repository/public/"
}
//default is https://repo.maven.apache.org/maven2/
mavenCentral()
//default is https://jcenter.bintray.com/
jcenter()
//default is https://dl.google.com/dl/android/maven2/
google()
//customize repository
maven {
url "https://maven.aliyun.com/repository/public/"
}
maven {
url "https://maven.springframework.org/release/"
}
maven {
url "https://maven.restlet.com/"
}
// mavenLocal()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
在maven中配置多模块项目是这么配置的
<modules>
<module>simple-weathermodule>
<module>simple-webappmodule>
modules>
在Gradle中则需要这么配置
rootProject.name = 'simple-multi-module'
include 'simple-weather', 'simple-webapp'
在maven中为插件配置参数是这么做的
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-checkstyle-pluginartifactId>
<version>2.17version>
<executions>
<execution>
<id>validateid>
<phase>validatephase>
<configuration>
<configLocation>checkstyle.xmlconfigLocation>
<encoding>UTF-8encoding>
<consoleOutput>trueconsoleOutput>
<failsOnError>truefailsOnError>
<linkXRef>falselinkXRef>
configuration>
<goals>
<goal>checkgoal>
goals>
execution>
executions>
plugin>
在gradle中则需要这么做
checkstyle {
config = resources.text.fromFile('checkstyle.xml', 'UTF-8')
showViolations = true
ignoreFailures = false
}
Gradle 比Maven 好处有三点:
- 高度可定制化:Gradle高度可定制化和扩展,可以完成更多更复杂的自动化脚本任务。
- 更快:编译构建速度更快,据官网介绍Gradle比Maven快了2-10倍
- 更强大:Gradle是Android的官方构建工具,并支持许多流行的语言和技术,超过二十多个顶级开源项目都在使用。
本篇完~