Learn Gradle - CH 3 Java 快速入门

上一章(链接)我们主要对Gradle的脚本进行了简要的介绍,本章我们将继续学习Gradle的另外一个特性——插件(plugins)。

1、插件介绍

插件是对Gradle功能的扩展,Gradle有着丰富的插件,你可以在这里搜索相关插件(传送门)。本章将简要介绍Gradle的Java插件(Java plugin),这个插件会给你的构建项目添加一些任务,比如编译java类、执行单元测试和将编译的class文件打包成jar文件等。

Java插件是基于约定的(约定优于配置),它在项目的很多方面定义了默认值,例如,Java源文件应该位于什么位置。我们只要遵循插件的约定,就不需要在Gradle配置脚本进行额外的相关配置。当然,在某些情况下,你的项目不想或不能遵循这个约定也是可以的,这样你就需要额外的配置你的构建脚本。

Gradle Java插件对于项目文件存放的默认位置与maven类似。

Java源码存放在目录:src/main/java

Java测试代码存放目录:src/test/java

资源文件存放目录:src/main/resources

测试相关资源文件存放目录:src/test/resources

所有输出文件位于目录:build

输出的jar文件位于目录:build/libs

2、一个简单的Java项目

新建一个文件build.gradle,添加代码:

apply plugin: ‘java‘

以上代码即配置java插件到构建脚本中。当执行构建脚本时,它将给项目添加一系列任务。我们执行:gradle 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

BUILD SUCCESSFUL

根据输出结果可以看出,我们执行的build这个任务依赖其他任务,比如compileJava等,这就是java插件预先定义好的一系列任务。

你还可以执行一些其他的任务,比如执行:gradle clean,gradle assemble,gradle check等。

gradle clean:删除构建目录以及已经构建完成的文件;

gradle assemble(装配):编译和打包java代码,但是不会执行单元测试(从上面的任务依赖结果也可以看出来)。如果你应用了其他插件,那么还会完成一下其他动作。例如,如果你应用了War这个插件,那么这个任务将会为你的项目生成war文件。

gradle check:编译且执行测试。与assemble类似,如果你应用了其他包含check任务的插件,例如,Checkstyle插件,那么这个任务将会检查你的项目代码的质量,并且生成检测报告。

如果想知道Gradle当前配置下哪些任务可执行,可以执行:gradle tasks,例如应用了java插件的配置,执行该命令,输出:

:tasks

------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles classes ‘main‘.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles classes ‘test‘.

Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]

Documentation tasks
-------------------
javadoc - Generates Javadoc API documentation for the main source code.

Help tasks
----------
components - Displays the components produced by root project ‘learn-gradle‘. [incubating]
dependencies - Displays all dependencies declared in root project ‘learn-gradle‘                                                                                                      .
dependencyInsight - Displays the insight into a specific dependency in root project ‘learn-gradle‘.
help - Displays a help message.
model - Displays the configuration model of root project ‘learn-gradle‘. [incubating]
projects - Displays the sub-projects of root project ‘learn-gradle‘.
properties - Displays the properties of root project ‘learn-gradle‘.
tasks - Displays the tasks runnable from root project ‘learn-gradle‘.

Verification tasks
------------------
check - Runs all checks.
test - Runs the unit tests.

Rules
-----
Pattern: clean<TaskName>: Cleans the output files of a task.
Pattern: build<ConfigurationName>: Assembles the artifacts of a configuration.
Pattern: upload<ConfigurationName>: Assembles and uploads the artifacts belonging to a configuration.

To see all tasks and more detail, run gradle tasks --all

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

BUILD SUCCESSFUL

小伙伴们看到这里会不会有疑问,如果在构建脚本中定义了名为tasks的任务,执行会是如何?好奇的小伙伴可以自己试一试噢。事实上,是会覆盖原有的任务的。

3、外部依赖

通常一个Java项目会依赖多个其他项目或jar文件,我们可以通过配置gradle仓库(repository)告诉gradle从哪里获取需要的依赖,并且gradle还可以配置使用maven仓库。例如,我们配置gradle使用maven中央仓库,在build.gradle中添加代码:

repositories {
    mavenCentral()
}

接下来,我们来添加一些依赖。代码示例:

dependencies {
    compile group: ‘commons-collections‘, name: ‘commons-collections‘, version: ‘3.2‘
    testCompile group: ‘junit‘, name: ‘junit‘, version: ‘4.+‘
}

关于依赖,暂时就点这么多。详细可以参考gradle依赖管理基础,也可以关注后续文章。

4、定义项目属性

Java插件会为项目添加一系列的属性,通常情况下,初始的Java项目使用这些默认配置就足够了,我们不需要进行额外的配置。但是如果默认属性不满足于你的项目,你也可以进行自定义项目的一些信息。例如我们为项目指定版本号和一些jar manifest信息。

sourceCompatibility = 1.5
version = ‘1.0‘
jar {
    manifest {
        attributes ‘Implementation-Title‘: ‘Gradle Quickstart‘, ‘Implementation-Version‘: version
    }
}

事实上,Java插件添加的一系列任务与我们之前在脚本中自定义的任务没什么区别,都是很常规的任务。我们可以随意定制和修改这些任务。例如,设置任务的属性、为任务添加行为、改变任务的依赖,甚至替换已有的任务。例如我们可以配置Test类型的test任务,当test任务执行的时候,添加一个系统属性。配置脚本如下:

test {
    systemProperties ‘property‘: ‘value‘
}

另外,与之前提到的“gradle tasks”命令类型,我们可以通过“gradle properties”来查看当前配置所支持的可配置属性有哪些。

5、将Jar文件发布到仓库

uploadArchives {
    repositories {
       flatDir {
           dirs ‘repos‘
       }
    }
}

执行gradle uploadArchives,将会把相关jar文件发布到reops仓库中。更多参考:Publishing artifacts

6、构建多个Java项目

假设我们的项目结构如下所示:

multiproject/
--api/
--services/webservice/
--shared/
--services/shared/

项目api生成jar文件,Java客户端通过jar提供的接口访问web服务;项目services/webservice是一个webapp,提供web服务;项目shared 包含api和webservice公共代码;项目services/shared依赖shared项目,包含webservice公共代码。

接下来,我们开始定义多项目构建。

1)首先,我们需要添加一个配置文件:settings.gradle文件。settings.gradle位于项目的根目录,也就是multiproject目录。编辑settings.gradle,输入配置信息:

include "shared", "api", "services:webservice", "services:shared"

include是Gradle DSL定义的核心类型Settings的方法,用于构建指定项目。配置中指定的参数“shared”、“api”等值默认是当前配置目录的目录名称,而“services:webservice”将根据默认约定映射系统物理路径"services/webservice"(相对于根目录)。关于include更详细的信息可以参考:构建树

2)定义所有子项目公用配置。在根目录创建文件:build.gradle,输入配置信息:

subprojects {
    apply plugin: ‘java‘
    apply plugin: ‘eclipse-wtp‘

    repositories {
       mavenCentral()
    }

    dependencies {
        testCompile ‘junit:junit:4.12‘
    }

    version = ‘1.0‘

    jar {
        manifest.attributes provider: ‘gradle‘
    }
}

subprojects 是Gradle DSL定义的构建脚本模块之一,用于定义所有子项目的配置信息。在以上配置中,我们给所有子项目定义了使用“java”和“eclipse-wtp”插件,还定义了仓库、依赖、版本号以及jar(jar是Gradle的任务类型之一,任务是装配jar包,jar任务包含属性manifest,用于描述jar的信息,具体参考:Jar)。

我们在根目录执行gradle build命令是,这些配置会应用到所有子项目中。

3)给项目添加依赖

新建文件:api/build.gradle,添加配置:

dependencies {
    compile project(‘:shared‘)
}

以上,我们定义了api项目依赖shared项目,当我们在根目录执行gradle build命令时,gradle会确保在编译api之前,先完成shared项目编译,然后才会编译api项目。

同样,添加services/webservice/build.gradle,添加配置:

dependencies {
    compile project(‘:services:shared‘)
}

在根目录执行:gradle compileJava,输出:

:shared:compileJava UP-TO-DATE
:shared:processResources UP-TO-DATE
:shared:classes UP-TO-DATE
:shared:jar UP-TO-DATE
:api:compileJava UP-TO-DATE
:services:compileJava UP-TO-DATE
:services:shared:compileJava UP-TO-DATE
:services:shared:processResources UP-TO-DATE
:services:shared:classes UP-TO-DATE
:services:shared:jar UP-TO-DATE
:services:webservice:compileJava UP-TO-DATE

BUILD SUCCESSFUL

通过输出信息我们就可以清楚看出依赖配置是否正确啦。本次教程到此结束。

本文是本人初学Gradle所作笔记,是在边学习Gradle边写作的情况下完成,如果错漏,还请看客们勿喷。若能友好指出,共同进步,本人不甚感激。

时间: 2024-09-30 20:02:32

Learn Gradle - CH 3 Java 快速入门的相关文章

NetBeans工具学习之道:NetBeans IDE Java 快速入门教程

欢迎使用 NetBeans IDE! 本教程通过指导您创建一个简单的 "Hello World" Java 控制台应用程序,简要介绍 NetBeans IDE 工作流.学习完本教程后,您将对如何在 IDE 中创建和运行应用程序有一个基本了解. 学习完本教程所需的时间不到 10 分钟. 学完本教程后,您可以转至文档.培训和支持页中链接的学习资源.这些学习资源提供了综合性教程,其中重点介绍适用各种应用程序类型的更多 IDE 功能和编程技巧.如果您不希望创建 "Hello Worl

.Net程序员玩转Android系列之一~Java快速入门

前段时间受公司业务发展需要,探索性进入Android开发领域.一切从零开始,java基础,Java进阶,Android框架学习,Eclipse熟悉,最终到第一个即时通讯App完成,历经一个月的时间.实现内容包含一个即时通讯服务端,Mysql数据库搭建,Android客户端通讯App.完成之后公司出于战略考虑,暂时放弃了Android.让我觉得,哎,还是不要太相信领导的话为好...>..<...趁着记忆还不算模糊,打算把这段经历和学习过程记录下来,以备日后需要. 只会一门语言的只能称之为技术人员

Java快速入门,从这六条技能开始

一.掌握静态方法和属性 静态方法和属性用于描述某一类对象群体的特征,而不是单个对象的特征.Java中大量应用了静态方法和属性,这是一个通常的技巧.但是这种技巧在很多语言中不被频繁地使用.理解静态方法和属性对于理解类与对象的关系是十分有帮助的,在大量的Java规范中,静态方法和属性被频繁使用.因此学习者应该理解静态方法和属性.Java在方法和属性的调用上是一致的,区别只表现在声明的时候,这和c++是不同的. 二.重视接口 在面向对象早期的应用中大量使用了类继承.随着软件工程理论的不断发展,人们开始

Learn Gradle - CH 2 基本的构建脚本介绍

1.项目和任务 Gradle 构建脚本包括两个最基本的概念,就是项目(projects)和任务(tasks). 项目是指我们的构建产物(比如jar包)或实施产物(比如web application等).Gradle构建脚本包含一个或多个项目. 任务是指不可分的最小工作单元,执行构建工作(比如编译一些类文件.创建jar文件.生成javadoc以及发布架构文档到仓库等).一个项目包含一个或多个任务. 2.Hello World!! 下面我们学习一个简单的hello world例子来简单认识一下Gra

JAVA快速入门方法

1.JAVA运行环境搭建(tomcat): 2.JAVA开发环境搭建(intellij idea, eclipse, myeclipse): 3.JAVA基本语法,Web知识初步(html表单,cookie,session): 4.数据库基础知识(mysql数据库,sql cookbook): 5.JAVA WEB开发框架基本原理及配置(Spring MVC, mybatis ...): 6.开源代码学习(step by step) (1)ZBLOG(代码:https://github.com/

Learn Gradle - CH 1 安装

以下所有学习过程基于Window 8 环境 1.下载Gradle 方式一:http://gradle.org/  使用首页Download链接直接下载最新版. 方式二:http://gradle.org/gradle-download/  在"PREVIOUS RELEASES"(右侧)下方选择一个版本,然后选择完整版"Complete distribution"或者选择不含源码和文档仅包含程序的版本"Binary only distribution&qu

1、Java快速入门

第一课 Java基础1. ubuntu上环境搭建 (建议使用我们提供的VMWare映象文件) 如果要自己安装ubuntu, 请参考<韦东山Android系统视频使用手册.pdf> ubuntu 12.04.5 这是一个长期支持的版本 硬盘空间至少预留80Ga. root分区 : 20G, 从其中划出6G用作swapb. work分区 : 60Gc. 内存 : 4G 安装Java开发环境sudo apt-get updatesudo apt-get install openjdk-7-jdksu

Java:Java快速入门

源代码组织方式 Java程序由package+class组成,package对应目录的相对路径. 1 package com.happyframework.javastudy.hello;2 3 public final class Hello {4 public static void hello(){5 System.out.println("hello!");6 }7 }关于class有如下几点规则: 文件的名字必须和class的名字一致(public级别的class名字).文件

Gradle用户指南(章9:Groovy快速入门)

Gradle用户指南(章9:Groovy快速入门) 你可以使用groovy插件来构建groovy项目.这个插件继承了java插件的功能,且扩展了groovy编译.你的项目可以包含groovy代码.java代码或者两者混合.在其他方面,groovy项目与java项目是一致的,就像我们在章7:java快速入门中所看到的那样. 一个简单的groovy项目 让我们来看一个示例.使用groovy插件,需要添加下面的代码得到你的构建文件中. 注意:示例代码在gradle发布的源文件包的路径samples/g