Gradle快速上手——从Maven到Gradle
Posted zlaurora
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:DevEnvgradle-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%in。
接下来,验证安装,启动任意终端。运行 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安装路径中的confsettings.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的主要内容,如果未能解决你的问题,请参考以下文章