使用Gradle编译Java工程入门篇

文章目的

通过一个简单的HelloWorld Java项目,学会如何使用Gradle来编译打包我们的工程项目

需要准备

  • 一个熟悉的IDE开发工具
  • JDK 7及以上
  • Gradle 3.2以上

安装Gradle

推荐使用安装器安装,比如mac下使用Homebrew 安装($ brew update && brew install gradle),基于Unix的系统可使用SDKMAN 安装($ sdk install gradle 4.0.1),具体安装方法和步聚请参考官网安装地址:https://gradle.org/install/

为了测试Gradle是否安装成功,我们可以在命令行下执行gradle命令,其显示结果如下代表安装成功:

billyangMacBook-Air:~ billyang$ gradle
Starting a Gradle Daemon (subsequent builds will be faster)
:help

Welcome to Gradle 3.2.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>

BUILD SUCCESSFUL

Total time: 4.155 secs
billyangdeMacBook-Air:~ billyang$

创建一个简单的HelloWorld工程

为了更好演示如何使用Gradle脚本来编译我们的工程,我们尽量创造一个非常简单的java项目,它只包含一个HelloWorld.java文件。
打开我们熟悉的IDE工具,本文件中作者使用的是IntelliJ IDEA 14,创建一个HelloWorld的工程,创建步聚如下:

《使用Gradle编译Java工程入门篇》 图一 创建一个新工程
《使用Gradle编译Java工程入门篇》 图二 选择Gradle工程选项
《使用Gradle编译Java工程入门篇》 图三 设置项目配置项

接下来一路点下一步,直到最后完成,我们可以看到创建的工程目录结构如下:

《使用Gradle编译Java工程入门篇》 图四 默认的工程目录结构

IDE工具会自动为我们创建很多配置文件和目录,这是使用IDE的好处,不过对于初学者来说,一上来看到这么多文件和目录可能会不知所措。我们可以先把一些文件和目录去掉,等后期熟悉了Gradle的使用后,我们再来关注其它相关配置。最后精简的工程目录结构如下(真实项目不需要精简):

《使用Gradle编译Java工程入门篇》 图五 精简后的工程文件和目录结构

精简后主要包括有三个目录,一个gradle配置文件,具体介绍如下。
.gradle目录: 与Gradle相关的缓存配置等内容,为隐藏文件夹
.idea目录:与IDEA项目工程相关配置内容,为隐藏文件夹
src目录:Java代码目录
build.gradle配置文件:Gradle脚本配置文件

首先我们在src/main/java/目录下包名com.bill,然后再该包下创建了一个HelloWorld.java文件,其中输出打印:Hello world。

package com.bill;

/**
 * Created by Bill on 17/7/14.
 */
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello world");
    }
}

测试Gradle脚本

在IDEA工具中,打开Terminal终端(也可以直接打开系统终端),输入gradle tasks命令,查看当前工程中可使用的任务有哪些,如下:

《使用Gradle编译Java工程入门篇》 图六 查看gradle任务

从图中我们可以看到,IDEA自动为我们添加了一些默认的任务(后面有讲到如何添加的),具体任务说明如下:

Build tasks
-----------
assemble - 编译打包该工程内容
build - 编译打包并测试该工程
buildDependents - 编译打包并测试该工程和所有依赖它的工程
buildNeeded - 编译打包并测试该工程和它依赖的所有工程
classes - 编译打包主要的类文件
clean - 删除编译目录
jar - 编译打成jar包,这个jar包包含主要的类文件
testClasses - 编译打包测试类文件

在我们没有写任何gradle代码之前,我们可以先来亲自体验一下这些预添加的任务功能,我们选择build任务来编译打包该工程试下,其执行结果如下:

《使用Gradle编译Java工程入门篇》 图七 执行gradle build结果图

从图中,我们看到只要简单的一行命令,就完成了当前工程的编译打包工作,打包后会自动生成一个build文件夹,其目录结构详细介绍如下。
classes目录:存放编译后的类文件,就是.class文件
dependency-cache:存放相关依赖的缓存数据
libs:存放最终编译打好的jar包
tmp:存放编译过程中的临时文件

通过Gradle的这些任务我们可以很方便的编译打包工程,而以上这些任务又是通过添加插件来轻松实现的,先让我们看看在创建工程时,IDE工具都为我们自动添加了哪些gradle脚本内容?

group 'com.bill'  // 在图三中设置的group项
version '1.0-SNAPSHOT' // 在图三中设置的version项

// 第三方插件
apply plugin: 'java'

// 设置 JDK 版本
sourceCompatibility = 1.8
targetCompatibility = 1.8

// 指定maven仓库为maven中央仓库
repositories {  
    mavenCentral()
}

// 设置项目的依赖库
dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

相关各行代码的注释已经很明确了,其中最关键一行为apply plugin: 'java',它告诉gradle使用第三方java插件,这样我们才能简单的使用gradle build命令来编译打包了,而gradle的java插件具体包括哪些任务,以及各任务之间的依赖关系,可以参考官网(https://docs.gradle.org/3.3/userguide/java_plugin.html) ,其具体的关系图如下:

《使用Gradle编译Java工程入门篇》 图八 gradle java插件任务依赖关系

再结合之前执行gradle build命令的过程(见图七),我们可以清晰的看到各任务的执行顺序(图八中箭头表明了build的调用过程):

: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

向Gradle中添加依赖库

接下来我们实现添加一个依赖包,比如使用Gson实现对json的操作。首先在maven仓库(https://mvnrepository.com/) 中搜索Gson,结果如下:

《使用Gradle编译Java工程入门篇》 图九 maven仓库中Gson

把其中compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'拷贝到build.gradle文件中,其完整如下如下:

group 'com.bill'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.0'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

然后在HelloWorld.java中添加如下代码:

public class HelloWorld {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("Bill.Yang");
        p.setAge(30);

        Gson gson = new GsonBuilder().create();
        String pJson = gson.toJson(p);

        System.out.println("Hello world," + pJson);
    }
}

同时添加Person.java类,如下所示:

public class Person {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

现在我们再执行gradle build命令,看看编译后的结果是什么样?这次我们可以使用IDEA工具的可视化界面来执行build命令,如下:

《使用Gradle编译Java工程入门篇》 图十 可视化执行build命令

编译一切正常,证明我们刚刚加入的依赖库已经被成功的引入工程中了。

指定Jar包的名称

大多时候,我们希望最后生成的jar包是自己指定的名称,而不是使用工程的项目名称,Gradle为我们提供了如下方式:

jar {
    baseName = 'first-gradle'
    version =  '0.1.0'
}

通过jar代码块指定了如何命令JAR文件,在本例中它将会被命令为:first-gradle-0.1.0.jar,如下图:

《使用Gradle编译Java工程入门篇》 图十一 指定jar名称

使用Gradle Wrapper编译项目

在用Gradle编译工程时,使用Gradle Wrapper是一种非常好的方式,它为Windows、OS X和Linux平台都提供了相应的脚本文件,这些脚本使你可以在不同平台的不同Gradle版本上正确地执行你的编译打包脚本。我们只需要执行一行命令,Gradle就会自动为我们的项目添加Wrapper相关配置信息,而不需要手动修改任何的代码配置等,其命令如下:

$ gradle wrapper --gradle-version 3.2

当执行完上面命令后,你会注意到项目中增加了一些新的文件:根目录下的两个脚本文件;一个gradle/wrapper的目录。其结构如下:

《使用Gradle编译Java工程入门篇》 图十二 添加Wrapper后的目录结构

现在可以使用Gradle Wrapper编译我们的工程了,我们也能把Wrapper相关的配置信息添加到版本控制系统中,其他任何人克隆了我们的工程也能使用相同的方式编译打包该工程。

./gradlew build

总结

祝贺你已经成功的通过Gradle实现了一个简单的HelloWorld工程编译打包任务,在这里你了解到了Gradle的安装方法、如何使用gradle build来编译项目、如何向工程中添加依赖库、以及如何使用Gradle Wrapper编译工程。想了解更多其它内容,可以关注云时代构架。

参加技术分享

《使用Gradle编译Java工程入门篇》 云时代架构公众号
《使用Gradle编译Java工程入门篇》 杨彪的简书博客

    原文作者:云时代构架杨彪
    原文地址: https://www.jianshu.com/p/23b25884deb2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞