美文网首页web学习
Gradle构建初探

Gradle构建初探

作者: eSky | 来源:发表于2017-02-22 22:56 被阅读53次

    1. 什么是gradle?

    很高兴能向大家介绍Gradle,这是一个基于JVM的富有突破性构建工具。

    它为您提供了:

    一个像ant一样,通用的灵活的构建工具

    一种可切换的,像maven一样的基于约定约定优于配置的构建框架

    强大的多工程构建支持

    强大的依赖管理(基于ApacheIvy)

    对已有的maven和ivy仓库的全面支持

    支持传递性依赖管理,而不需要远程仓库或者pom.xml或者ivy配置文件

    ant式的任务和构建是gradle的第一公民

    基于groovy,其build脚本使用groovy dsl编写

    具有广泛的领域模型支持你的构建

    2. Gradle特性

    基于声明的构建和基于约定的构建

    Gradle的核心在于基于Groovy的丰富而可扩展的域描述语言(DSL)。 Groovy通过声明性的语言元素将基于声明的构建推向下层,你可以按你想要的方式进行组合。 这些元素同样也为支持Java, Groovy, OSGi, Web和Scala项目提供了基于约定的构建。 并且,这种声明性的语言是可以扩展的。你可以添加新的或增强现有的语言元素。 因此,它提供了简明、可维护和易理解的构建。

    为以依赖为基础的编程方式提供语言支持

    声明性语言优点在于通用任务图,你可以将其充分利用在构建中. 它提供了最大限度的灵活性,以让Gradle适应你的特殊需求。

    构建结构化

    Gradle的灵活和丰富性最终能够支持在你的构建中应用通用的设计模式。 例如,它可以很容易地将你的构建拆分为多个可重用的模块,最后再进行组装,但不要强制地进行模块的拆分。 不要把原本在一起的东西强行分开(比如在你的项目结构里),从而避免让你的构建变成一场噩梦。 最后,你可以创建一个结构良好,易于维护,易于理解的构建。

    多项目构建

    Gradle对多项目构建的支持非常出色。项目依赖是首先需要考虑的问题。 我们允许你在多项目构建当中对项目依赖关系进行建模,因为它们才是你真正的问题域。 Gradle遵守你的布局。

    Gradle提供了局部构建的功能。 如果你在构建一个单独的子项目,Gradle也会帮你构建它所依赖的所有子项目。 你也可以选择重新构建依赖于特定子项目的子项目。 这种增量构建将使得在大型构建任务中省下大量时间。

    多种方式管理依赖

    不同的团队喜欢用不同的方式来管理他们的外部依赖。 从Maven和Ivy的远程仓库的传递依赖管理,到本地文件系统的jar包或目录,Gradle对所有的管理策略都提供了方便的支持。

    Groovy

    Gradle的构建脚本是采用Groovy写的,而不是用XML。 但与其他方法不同,它并不只是展示了由一种动态语言编写的原始脚本的强大。 那样将导致维护构建变得很困难。 Gradle的整体设计是面向被作为一门语言,而不是一个僵化的框架。 并且Groovy是我们允许你通过抽象的Gradle描述你个人的story的黏合剂。 Gradle提供了一些标准通用的story。这是我们相比其他声明性构建系统的主要特点。 我们的Groovy支持也不是简单的糖衣层,整个Gradle的API都是完全groovy化的。只有通过Groovy才能去运用它并对它提高效率。

    自由和开源

    Gradle是一个开源项目,并遵循ASL许可。

    3.Groovy介绍及为什么使用Groovy?

    Groovy是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代java,而是指Groovy和java很好的结合编程。)

    我们认为内部DSL(基于一种动态语言)相比XML在构建脚本方面优势非常大。它们是一对动态语言。 为什么使用Groovy?答案在于 Gradle 内部的运行环境。 虽然 Gradle 核心目的是作为通用构建工具,但它还是主要面向 Java 项目。 这些项目的团队成员显然熟悉 Java。我们认为一个构建工具应该尽可能地对所有团队成员透明。你可能会想说,为什么不能使用 Java来作为构建脚本的语言。 我认为这是一个很有意义的问题。对你们的团队来讲,它确实会有最高的透明度和最低的学习曲线。 但由于 Java 本身的局限性,这种构建语言可能就不会那样友善、 富有表现力和强大。这也是为什么像 Python,Groovy 或者 Ruby 这样的语言在这方面表现得更好的原因。 我们选择了 Groovy,因为它向Java人员提供了目前为止最大的透明度。 其基本的语法,类型,包结构和其他方面都与 Java一样,Groovy 在这之上又增加了许多东西。但是和Java也有着共同点。

    4.Gradle安装

    去官网下载https://gradle.org/目前最新版本

    windows安装:

    设置环境变量

    GRADLE_HOME = D:\Program Files\gradle-X.X

    Path = %GRADLE_HOME%\bin

    Linux安装:

    $ mkdir /opt/gradle

    $ unzip -d /opt/gradle gradle-3.3-bin.zip

    $ ls /opt/gradle/gradle-3.3

    LICENSE  NOTICE  bin  getting-started.html  init.d  lib  media

    $ export PATH=$PATH:/opt/gradle/gradle-3.3/bin

    $ gradle -v

    安装好后默认gradle的本地仓库在用户家目录下的.gradle里面,如果想改变仓库位置, 那   么就要配置环境变量:

    GRADLE_USER_HOME = 自定义目录/.gradle

    5. 构建

    本篇将讲述如何用idea去构建一个gradle多模块关联的项目,附上项目下载地址(https://github.com/zhangsongyang/milestone)

    5.1 File->New->Project-> 选择Gradle

    5.2 next填写Groupld和Artifactld然后Next

    这里建议勾选上Use auto-import和Create directories for empty content roots automatically,意思是说开启自动下载包和创建项目目录结构,如果不勾选就要手动创建了。

    选择上Use local gradle distribution用本地自己配置的gradle,然后next,finish。

    5.3 build.gradle文件用于编写项目构建信息,settings.gradle在多模块构建中用于定义多个模块名

    build.gradle概要:

    group'cn.zsy'

    version'1.0-SNAPSHOT'

    applyplugin:'java'

    sourceCompatibility =1.8

    //// 声明gradle脚本自身需要使用的资源,包括依赖项、

    //第三方插件、maven仓库地址等

    buildscript {

    repositories {

    mavenLocal()

    mavenCentral()

    jcenter()

    maven {

    name'Custom Maven Repository'

    url'http://maven.aliyun.com/nexus/content/

    repositories/central/'

    }

    }

    dependencies {

    classpath'org.gradle.api.plugins:gradle-nexus-plugin:0.4'

    classpath'org.hibernate.build.gradle:

    gradle-maven-publish-auth:2.0.1+'

    }

    }

    allprojects {

    group'cn.zsy'

    version'1.0-SNAPSHOT'

    // JVM 版本号要求

    sourceCompatibility =1.8

    targetCompatibility =1.8

    // java编译的时候缺省状态下会因为中文字符而失败

    [compileJava,compileTestJava,javadoc]*.options*.

    encoding ='UTF-8'

    applyplugin:'java'

    applyplugin:'idea'

    applyplugin:'maven-publish'

    applyplugin:'maven-publish-auth'

    applyplugin:'findbugs'

    applyplugin:'project-report'

    repositories {

    mavenLocal()

    maven {

    name'Custom Maven Repository'

    url'http://maven.aliyun.com/nexus/content/repositories/central/'

    }

    mavenCentral()

    jcenter()

    }

    publishing {

    publications{

    mavenJava(MavenPublication) {

    fromcomponents.java

    }

    }

    repositories {

    maven {

    name='thinkjoy'

    url"http:/xxxx/content/repositories/

    ${project.version.endsWith('-SNAPSHOT') ?'snapshots':'releases'}"

    }

    }

    }

    ext{

    jedisVersion ='2.9.0'

    commonslang3Version ='3.5'

    nettyVersion ='4.1.8.Final'

    }

    dependencies {

    compile"redis.clients:jedis:${jedisVersion}"

    compile"org.apache.commons:commons-lang3:${commonslang3Version}"

    compilegroup:'org.aspectj',name:'aspectjweaver',version:'1.8.10'

    compilegroup:'org.slf4j',name:'slf4j-api',version:'1.7.23'

    compilegroup:'org.slf4j',name:'slf4j-log4j12',version:'1.7.23'

    compilegroup:'log4j',name:'log4j',version:'1.2.17'

    compilegroup:'com.alibaba',name:'fastjson',version:'1.2.24'

    compilegroup:'org.springframework',name:'spring-context',version:'4.3.6.RELEASE'

    compilegroup:'org.springframework',name:'spring-context-support',version:'4.3.6.RELEASE'

    compilegroup:'org.springframework',name:'spring-jdbc',version:'4.3.6.RELEASE'

    compilegroup:'org.springframework',name:'spring-orm',version:'4.3.6.RELEASE'

    compilegroup:'org.springframework',name:'spring-aspects',version:'4.3.6.RELEASE'

    compilegroup:'org.springframework',name:'spring-oxm',version:'4.3.6.RELEASE'

    compilegroup:'org.springframework',name:'spring-test',version:'4.3.6.RELEASE'

    testCompilegroup:'junit',name:'junit',version:'4.12'

    }

    findbugs {

    ignoreFailures =true

    //    findbugsTest.enabled=false

    }

    tasks.withType(FindBugs) {

    reports{

    xml.enabled =false

    html.enabled =true

    }

    }

    }

    buildscript是用来声明gradle脚本自身需要的资源,包括依赖项、第三方插件、maven仓库地址等。

    allprojects用于声明所用模块的共有信息。

    apply plugin:'java'

    定义一个Java项目只需如此而已.这将会为你添加Java插件及其一些内置任务.

    apply plugin:'findbugs'

    该插件向你的项目添加了大量的执行质量检查的任务。

    applyplugin:'maven-publish'

    applyplugin:'maven-publish-auth'

    用于发布到本地仓库或远程仓库上的插件。

    repositories {

    mavenLocal()

    maven {

    name'Custom Maven Repository'

    url'http://maven.aliyun.com/nexus/content/repositories/central/'

    }

    mavenCentral()

    jcenter()

    }

    用于配置仓库

    mavenLocal()是本地仓库

    maven {

    name 'Custom Maven Repository'

    url 'http://maven.aliyun.com/nexus/content/repositories/central/'

    }

    自定义自己的远程仓库

    mavenCentral()   jcenter()中央仓库

    publishing {

    publications{

    mavenJava(MavenPublication) {

    fromcomponents.java

    }

    }

    repositories {

    maven {

    name='thinkjoy'

    url"http://repo.qtonecloud.cn/content/repositories/${project.version.endsWith('-SNAPSHOT') ?'snapshots':'releases'}"

    }

    }

    }

    配置publish到那个远程仓库,配置成功在idea上可以看到远程仓库的名字

    ext{

    jedisVersion ='2.9.0'

    commonslang3Version ='3.5'

    nettyVersion ='4.1.8.Final'

    }

    ext用于定义一些配置的版本信息,如jar的版本号。

    dependencies

    下面定义依赖的jar

    compile"org.apache.commons:commons-lang3:${commonslang3Version}"

    compilegroup:'org.aspectj',name:'aspectjweaver',version:'1.8.10'

    compile project(':milestone-service')

    providedCompile"javax.servlet:javax.servlet-api:3.1.0"

    testCompilegroup:'junit',name:'junit',version:'4.12'

    http://mvnrepository.com/可以查找jar的gradle的坐标

    applyplugin:'war'

    添加用于组装 web 应用程序的 WAR 文件的支持。

    上图红框中一般是比较常用的几个task,

    用gradle打好war包后可以用gradle的tomcat插件或idea里面配置tomcat来发布web程序。

    实例代码参见:https://github.com/zhangsongyang/milestone

    相关文章

      网友评论

      本文标题:Gradle构建初探

      本文链接:https://www.haomeiwen.com/subject/zwhvwttx.html