Gradle实战系列(一)__初体验

本系列文章主要目的并非要精通 Gradle ,而且是从应用的角度上,根据项目开发过程中,最经常用到的功能来说明如何从无到有建立自己的 Gradle 建构脚本。

必要条件

在使用 Gradle 之前,首先假设读者对于 Ant 及 Maven 已经有基本的认识并且有实际的使用经验

准备工作

  1. 安装 JDK ,在环境变量中设定 JAVA_HOME 。
  2. 下载 Gradle 压缩档,解压缩后在环境变量中设定 GRADLE_HOME 为解压缩后的文件夹路径,例如:C:\gradle-3.3,并且将 Gradle 安装目录中的 bin 文件夹加入环境变量的 Path 变量中,例如:C:\gradle-3.3\bin。

从无到有

首先建立工程资料夹 gradle_sample ,并且在该资料夹下执行初始化指令

gradle init

执行成功后,会在资料夹中产生基本的档案,其中 build.gradlesettings.gradle 这两个档案是主要的建构脚本

[gradle_sample]
├---[.gradle]
│   ├---[3.3]
│       ├---[taskArtifacts]
│           ├---fileHashes.bin
│           ├---fileSnapshots.bin
│           ├---taskArtifacts.bin
│           ├---taskArtifacts.lock
│
├---[gradle]
│   ├---[wrapper]
│       ├---gradle-wrapper.jar
│       ├---gradle-wrapper.properties
│
├---build.gradle
├---gradlew
├---gradlew.bat
├---settings.gradle

build.gradle

apply plugin: 'java'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.21'
    testCompile 'junit:junit:4.12'
}
  • apply plugin:表示执行过程将引入的插件
  • repositories:表示执行过程中会从哪些仓库中寻找依赖的 jar 包
  • dependencies:表示执行过程需要依赖的 jar 包

settings.gradle

rootProject.name = 'gradle_sample'
  • rootProject.name:表示项目名称,也是建构完成后预设的包名

Hellow Gradle

执行下列命令建立代码的文件夹

mkdir src\main\java

在 src\main\java 就爱如第一支程序 Hello.java

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello Gradle");
    }
}

Gradle 执行时透过命令列传入参数决定要执行哪些 task,一般重新建构整个工程至少会包含 cleanbuild 这两个 task

gradle clean build

建构过程中可以看到除了参数传入的两个 task 之外,实际上还执行了其他默认被依赖的 task

:clean
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build

BUILD SUCCESSFUL

Total time: 1.252 secs

执行成功后可以在 gradle_sample\build\libs 这个路径下看到根据项目名称打包出来的 gradle_sample.jar

[gradle_sample]
├---[.gradle]
│   ├---[3.3]
│       ├---[taskArtifacts]
│           ├---fileHashes.bin
│           ├---fileSnapshots.bin
│           ├---taskArtifacts.bin
│           ├---taskArtifacts.lock
│
├---[build]
│   ├---[classes]
│   │   ├---[main]
│   │       ├---Hello.class
│   │
│   ├---[libs]
│   │   ├---gradle_sample.jar
│   │
│   ├---[tmp]
│   │   ├---[compileJava]
│   │   │   ├---[emptySourcePathRef]
│   │   │
│       ├---[jar]
│           ├---MANIFEST.MF
│
├---[gradle]
│   ├---[wrapper]
│       ├---gradle-wrapper.jar
│       ├---gradle-wrapper.properties
│
├---build.gradle
├---gradlew
├---gradlew.bat
├---settings.gradle

还记得在 Hello.java 中有一个 main 方法,我们可以透过修改 build.gradle,加入一个task,让 Gradle 自动帮我们执行这个 main 方法

 task run(type: JavaExec, dependsOn: 'build') {
    classpath = sourceSets.main.runtimeClasspath
    if(project.hasProperty('mainClass')){
        main = "${project.getProperty('mainClass')}"
    }
    doFirst {
        println "===== run begin"
    }
    doLast {
        println "===== run end"
    }
}

这是一个类型为 JavaExec 的 task, task 名称为 run,是依赖于 build 之后执行的,在 task 主体中设定了 classpath, mainClass 参数表示带有 main 方法的完整类名,透过 -P 可以将 mainClass 参数传入 Gradle 执行, doFirst 及 doLast 可以在 task 执行前/后执行其他动作

gradle run -PmainClass=Hello

从执行结果中可以看出来, run 是在原本的 build 之后才执行的

:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar UP-TO-DATE
:assemble UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build UP-TO-DATE
:run
===== run begin
Hello Gradle
===== run end

BUILD SUCCESSFUL

Total time: 1.227 secs

设定包名及版本号

前面提到 rootProject.name 是预设的包名,在 build.gradle 透过 archivesBaseName 可以另外指定包名,同时透过设定 version 来指定版本号

archivesBaseName = 'sample.hello'
version = '1.0-SNAPSHOT'

重新执行后可以发现 jar 包名变成 sample.hello-1.0-SNAPSHOT.jar,除此之外也可以在 build.gradle 里面透过修改执行 build 时包含的 task jar 来设定包名及版本号

jar {
	baseName = 'sample.hello'
	version = '1.0-SNAPSHOT'
}

以上是本文对 Gradle 的基本介绍,可以由此下载 build.gradle

posted @ 2017-02-01 23:58  老林头  阅读(894)  评论(0编辑  收藏  举报