Gradle快速上手——从Maven到Gradle
【本文写作于2018年7月5日】
本文适合于有一定Maven应用基础,想快速上手Gradle的读者。
背景
Maven、Gradle都是著名的依赖管理及自动构建工具。提到依赖管理与自动构建,其重要性在当今软件环境下不言而喻,Maven也是红极一时。
Maven采用约定大于配置的思想,约定了工程结构,生命周期,采用严谨的XML格式进行构建脚本编写,显著地提升了软件构建的效率。但当软件越来越复杂后,大家突然发现Maven的脚本编制已然成了另外一个麻烦。绝大部分的使用者会掉入Maven的plugin陷阱——当你想做任何一件事,首先想到的是“能使用什么插件?”接下来,就是在海量的插件中不断寻找,甄选,终于找到了一个,打开文档,学习插件所关联的生命周期,在合适位置进行配置,编写脚本。更可怕的问题是,在Maven中,Everything is plugin。即使一个非常简单的操作,也需要寻找对应的插件,完成繁复的配置。插件使用较多时,插件之间还非常容易出现冲突,对某个操作,每个插件关联的构建时机不同,配置上还需要很多技巧。久而久之,Maven的脚本构建,自身就可以写出一本厚厚的书,而对于脚本的编写者——开发人员——来说,为了完成一个自动化的动作所付出的努力有可能都会超过软件本身,这不就是倒退吗?
为了解决这个问题,Gradle横空出世。Gradle使用Groovy语言,抽象出一套DSL,用于编写构建脚本。脚本风格与程序类似,非常符合开发人员的口味,脚本复杂度相比于XML而言,得到了极大的简化此外,Gradle在构建效率,操作便捷性上也比Maven有了较大的提高,因此越来越多的人开始倒向Gradle。
目前的Gradle最新版本已经到达5.0,但还没有释放正式版,最新的稳定版本是4.8.1。Gradle已经可以支持Java, C++, Python 以及多种主流语言,Gradle也是Google推荐的Android构建平台。
本文使用的软件版本
Gradle 4.8.1
Maven 3.2.2
Eclipse Photon Release (4.8.0)
JDK 1.8 Update 92 64bit
本文讲解基于操作系统Windows 10,开发一个Java应用程序。
Gradle安装
Gradle需要JDK1.7及以上版本,请自行准备。
保证JAVA_HOME,以及JAVA_HOME的bin目录已经配置在操作系统的path中。
Gradle安装非常简单,官方也提供了多种安装方式,所有主流系统的包管理器都可以使用。官方说明地址(https://gradle.org/install/)
不过对于长期混迹于Maven的老鸟来说,手动安装是了解一门新技术的好方法。
从:
https://downloads.gradle.org/distributions/gradle-4.8.1-bin.zip
下载Gradle 4.8.1的二进制包。
下载后解压至本地。
本例中,将之解压至D:\DevEnv\gradle-4.8.1,同时,也将完整二进制包“gradle-4.8.1-bin.zip ”也放到了这个目录中(后面有用)。
接下来,需要为Gradle创建一个用户目录,这个概念跟Maven一样(Maven默认在当前用户目录中创建.m2文件夹,就是用户目录)。
本例中,我们在D:\DevEnv中创建了一个用户目录gradle_user_home,这个目录会存放Gradle本地的配置,Wrapper,下载的库文件等等。
接下来在系统变量中,配置好GRADLE_HOME及GRADLE_USER_HOME环境变量。
同时,也请确认本机的Maven(如果有),也配置了M2_HOME环境变量。
接下来,配置path变量,添加%GRADLE_HOME%\bin。
接下来,验证安装,启动任意终端。运行 gradle -verion,显示类似下面内容即为成功。
使用Gradle创建一个工程
Gradle对工程结构的约定与Maven相同,对于java工程,代码保存在src/main/java,资源保存在src/main/resources。同样测试代码保存在src/test/java,测试资源src/test/resources。
Gradle不同于Maven的地方在于,一旦工程不是如约定的结构,Gradle经过简单配置即可兼容,但对于Maven,多源码文件结构是不被允许的。
本例演示创建一个VerifyCodeAPI的Java工程(最终可独立运行),首先建立VerifyCodeAPI文件夹,接下来,VerifyCodeAPI工程根目录下,执行gradle init --type "java-application",完成工程初始化。
注释:gradle init 还可以创建很多类型的初始化工程,可以参考 https://docs.gradle.org/4.8/userguide/build_init_plugin.html?_ga=2.5247931.945099620.1530760557-568871993.1530760557#sec:build_init_types
初始化完毕后,目录文件如下,可见gradle为工程建立了.gradle,gradle,build.gradle,gradlew,settings.gradle几个文件。
初始化过程,实际上是创建gradle wrapper的过程,gradlew就是gradle wrapper的缩写。有了gradle,为什么还要创建一个wrapper?
gradle是一款构建工具,其自身也存在多个版本,每个版本也存在着差异。每个项目使用一个特定的gradle版本,项目组也只能保证自动构建在指定的版本下运作正常。在实际开发时,项目与项目使用的Gradle版本很有可能不同,如果同时使用两个Gradle版本不同的项目怎么办?gradlew就是搞定这个问题来的。gradlew将本项目使用的gradle版本信息固化下来,保存在工程中,这些信息随着代码控制(Git、SVN等等)保存。使用了gradle wrapper后,每次构建项目使用gradlew命令行,而不是直接使用安装在系统中的gradle,如果本地没有gradlew中记录的gradle版本,gradlew会自动下载,这样的设计,可以保证在不同环境下,某一个项目使用特定版本的gradle进行编译。
Gradle生成的文件及作用如下:
1 工程配置脚本。
2 Gradle Wrapper的可执行 JAR包。
3 Gradle Wrapper配置properties文件。
4 Gradle Wrapper供Linux等类Unix系统使用的脚本
5 Gradle Wrapper供Windows使用的脚本
6 配置构建包含的工程的文件(多工程,多模块统一构建使用)
至此,工程创建完毕。
配置工程
接下来进行工程配置,最基本的,设置编码,JDK版本,配置工程依赖库。这部分都在build.gradle中完成。
本例配置如下:
buildscript {
ext {
springBootVersion = '2.0.3.RELEASE'
}
repositories {
/*
maven {
url "https://plugins.gradle.org/m2/"
}
*/ maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
//mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
}
} apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management' group = "dreamstudio.ai.verifyCode.api"
version = "3.0"
description = "VerifyCode API Application"
archivesBaseName = 'VerifyCode_API' sourceCompatibility = 1.8
targetCompatibility = 1.8 tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
} // java编译的时候缺省状态下会因为中文字符而失败
[compileJava,compileTestJava,javadoc]*.options*.encoding = 'UTF-8' repositories {
mavenLocal()
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
mavenCentral()
} bootJar {
baseName = 'verifyCode-api'
version = version
}
//配置依赖 dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation(
"net.sourceforge.tess4j:tess4j:4.0.2"
)
implementation group: 'commons-codec', name: 'commons-codec', version: '1.11'
}
下面对关键部分做以介绍:
1 buildscript。用于执行构建的脚本。gradle支持插件,这部分主要用于声明构建本工程使用的插件,本例中在dependencies部分声明的就是本工程依赖的插件。ext部分定义了一个变量,是插件版本,供下文引用。repositories标签中声明了这些插件的下载地址。本例中使用了阿里云的Maven库下载构建插件。
2 apply plugin。声明本工程使用的插件。这类插件通常包含了若干的Task,与Maven类似。本例中java,就是gradle提供的基本插件之一,包含了构建一个java工程常规的task,如编译类,测试,打包,执行,清理等等。
gradle还提供c++,groovy,java web,scala等基本插件,其他工程类型可以自行引入第三方插件,如Android Plugin。
3 工程基本描述。group = "dreamstudio.ai.verifyCode.api",等同于maven的的groupId,version = "3.0" 版本,
description = "VerifyCode API Application"描述,archivesBaseName = 'VerifyCode_API'工程打包文件名前缀。
4 JDK版本配置。sourceCompatibility = 1.8 源码版本1.8,targetCompatibility = 1.8编译目标版本1.8。
5 源码编码设置。
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
} // java编译的时候缺省状态下会因为中文字符而失败
[compileJava,compileTestJava,javadoc]*.options*.encoding = 'UTF-8'
保证编码都是UTF-8
6 依赖库仓库位置。repositories中声明了本工程依赖的包的仓库地址。Gradle可以使用多种类型的仓库。mavenLocal()表示使用本地Maven仓库(如果配置了环境变量,Gradle会从M2_HOME指向本地Maven安装路径中的conf\settings.xml中localRepository查找本地仓库),maven {url 'http://maven.aliyun.com/nexus/content/groups/public/'} 表示使用阿里云Maven库,mavenCentral()表示使用maven中央仓库。
gradle查找包的时候,会按照声明顺序,由上至下进行查找。
注意:对于本地maven库,gradle只会利用,当有不齐全的包时,gradle会下载,但不会存入本地maven库,而是存放在gradle的USER_HOME下的caches目录。
7 本工程依赖包声明。dependencies中声明本工程依赖。基本原理和Maven相同,写法比maven极大简化。
implementation(
"net.sourceforge.tess4j:tess4j:4.0.2"
)
implementation group: 'commons-codec', name: 'commons-codec', version: '1.11'
以上是两种写法,第一种和第二种等价。gradle中,group等同于maven的groupId,name等同于artifactId。
运行构建
工程配置完毕后,就可以进行项目开发,关于如何使用IDE进行Gradle的工程开发,将在其他文章中介绍。本例中假定已经完成开发。接下来,演示工程构建效果。
在工程根路径中,执行gradlew TASK名称 TASK名称 ... 可以执行构建的各个Task,执行某个Task时,其依赖的Task也会执行,这点与Maven类似,Gradle对构建进行了很多优化,可以自动检测工程的变化,只执行必要的构建,构建速度相比Maven提升较大。
本例中使用gradlew clean bootJar 执行了清理,以及构建可独立运行JAR的工作(bootJar Task是SpringBoot Gradle Plugin 提供,并不是标准java插件自带)。
构建完毕的文件,会输出到工程的build文件夹下。本例中libs中,就是最终可独立运行的文件。
小结
经过上述过程,相信熟悉Maven的同学已经可以独立搭建起Gradle运行环境,利用好目前搭建的Maven的仓库,并且完成一个独立的Java工程的创建(或者将已有工程改造成为Gradle工程)以及编译打包。
本文旨在快速上手,并没有关注Gradle的使用细节,关于Gradle使用的开发环境搭建,多工程、组件依赖,联合打包等等技巧将在其他文章中介绍。
Gradle快速上手——从Maven到Gradle的更多相关文章
- 快速上手使用Maven
maven的相关命令 mvn archetype:create :创建 Maven 项目 mvn compile :编译源代码(编译到target文件夹中) mvn test-compile :编译测 ...
- Liferay7 BPM门户开发之38: OSGi模块化Bndtools、Maven、Gradle开发构建入门
前言 OSGi是目前动态模块系统的事实上的工业标准,它适用于任何需要模块化.面向服务.面向组件的应用程序.Eclipse如此庞大和复杂的插件体系,就是基于OSGi.Liferay也是基于OSGi.OS ...
- Gradle学习系列之一——Gradle快速入门
这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构 ...
- Gradle学习系列之一——Gradle快速入门(转)
这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构 ...
- 快速掌握 Android Studio 中 Gradle 的使用方法
快速掌握 Android Studio 中 Gradle 的使用方法 Gradle是可以用于Android开发的新一代的 Build System, 也是 Android Studio默认的build ...
- 从零开始,跟我一起做jblog项目(三)从Maven到Gradle
http://www.cnblogs.com/newflydd/p/4972922.html?utm_source=tuicool&utm_medium=referral ********** ...
- Maven和Gradle对比
Java世界中主要有三大构建工具:Ant.Maven和Gradle.经过几年的发展,Ant几乎销声匿迹.Maven也日薄西山,而Gradle的发展则如日中天.笔者有幸见证了Maven的没落和Gradl ...
- Java构建工具:如何用Maven,Gradle和Ant+Ivy进行依赖管理
原文来自:https://zeroturnaround.com/rebellabs/java-build-tools-how-dependency-management-works-with-mave ...
- Maven、gradle、Ant、Eclipse IDE
Maven.gradle.Ant.Eclipse IDE之间的关系 http://wenku.baidu.com/view/d33208810912a21615792910.html?from=sea ...
随机推荐
- Facade(外观)模式
1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...
- CABasicAnimation使用总结
CABasicAnimation使用总结 实例化 使用方法animationWithKeyPath:对 CABasicAnimation进行实例化,并指定Layer的属性作为关键路径进行注册. //围 ...
- App Store 加急审核解析
什么是加急审核 首先,提交二进制文件到 App Store,是要交给 App Store Review 团队去审核的.下面这句话是我从他们那边拿到的官方数据: On average, 50 perce ...
- MySql 5.7.21免安装版本win10下的配置
1.解压到想要安装的位置,创建my.ini文件 my.ini的内容如下 [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设 ...
- debian系统,启动Wireshark,出现Couldn't run /usr/bin/dumpcap in child process:权限不够
这是由于当前用户没有权限运行/usr/bin/dumpcap造成的./usr/bin/dumpcap是Wireshark的包捕获引擎. 先用ls命令看一下dumpcap的权限情况:xy@debian- ...
- BigData:值得了解的十大数据发展趋势
当今,世界无时无刻不在发生着变化.对于技术领域而言,普遍存在的一个巨大变化就是为大数据(Big data)打开了大门,并应用大数据技相关技术来改善各行业的业务并促进经济的发展.目前,大数据的作用已经上 ...
- A1038
用一串数拼接成一个数,输出最小的. 思路:使用string和相关的函数. #include<iostream> #include<cstdio> #include<str ...
- python获取网页编码问题(encoding和apparent_encoding)
在requests获取网页的编码格式时,有两种方式,而结果也不同,通常用apparent_encoding更合适 注:推荐一个大佬写的关于获取网页编码格式以及requests中text()和conte ...
- vue 解决跨域问题
1.后端处理允许跨域 2.反向代理跨域 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去去的网络信息.形象的说:它是网络信息的中转站. vue中设置代理: 1.config/in ...
- css3动画性能优化--针对移动端卡顿问题
一.使用css,jquery,canvas制作动画 1.Canvas 优点:性能好,强大,支持多数浏览器(除了IE6.IE7.IE8),画出来的图形可以直接保存为 .png 或者 .jpg的图形: 缺 ...