zoukankan      html  css  js  c++  java
  • 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使用的开发环境搭建,多工程、组件依赖,联合打包等等技巧将在其他文章中介绍。

  • 相关阅读:
    (总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解
    一个自动安装LNMP的简洁Shell脚本
    (总结)Nginx配置文件nginx.conf中文详解
    Linux 的启动流程
    Linux运维文档之nginx
    nginx索引目录配置
    nginx实现图片防盗链(referer指令)
    nginx记录分析网站响应慢的请求(ngx_http_log_request_speed)
    C# 使用WinRar命令压缩和解压缩
    localStorage存值取值以及存取JSON,以及基于html5 localStorage的购物车
  • 原文地址:https://www.cnblogs.com/zlAurora/p/9309499.html
Copyright © 2011-2022 走看看