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的主要内容,如果未能解决你的问题,请参考以下文章

Gradle的使用——快速找到自己想要在gradle中使用的jar包

Maven 上手指南

如果快速将maven项目转成gradle项目

将Java项目从maven迁移到gradle

将Java项目从maven迁移到gradle

从 Maven 2/3 迁移到 Gradle