Gradle基本入门

Gradle快速入门

和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin。Gradle在默认情况下为我们提供了许多常用的Plugin,其中包括有构建Java项目的Plugin,还有War,Ear等。与Maven不同的是,Gradle不提供内建的项目生命周期管理,只是java Plugin向Project中添加了许多Task,这些Task依次执行,为我们营造了一种如同Maven般项目构建周期。

现在我们都在谈领域驱动设计,Gradle本身的领域对象主要有Project和Task。Project为Task提供了执行上下文,所有的Plugin要么向Project中添加用于配置的Property,要么向Project中添加不同的Task。一个Task表示一个逻辑上较为独立的执行过程,比如编译Java源代码,拷贝文件,打包Jar文件,甚至可以是执行一个系统命令或者调用Ant。另外,一个Task可以读取和设置Project的Property以完成特定的操作。

创建步骤

  • 创建文件夹并初始化
mkdir gradle_demo

cd gradle_demo

gradle init
  • 查看结构目录
    终端输入:
 tree -f

如果你没有安装tree,请先安装tree,如下:

brew install tree

得到的目录如下:

.
├── ./build.gradle
├── ./gradle
│   └── ./gradle/wrapper
│       ├── ./gradle/wrapper/gradle-wrapper.jar
│       └── ./gradle/wrapper/gradle-wrapper.properties
├── ./gradlew
├── ./gradlew.bat
└── ./settings.gradle

build.gradle

gradle项目自动编译的时候要读取的配置文件。比如指定项目的依赖包等。
build.grade有两个,一个是全局的,一个是在模块里面。
全局的build.grade主要设置的是声明仓库源,gradle的版本号说明等。

gradle

gradlew / gradlew.bat

自动完成 gradle 环境的脚本,在 linux 和 mac 下直接运行 gradlew 会自动完成 gradle 环境的搭建。

settings.gradle

整个项目的管理,比如这个项目包含哪些模块等

Task

让我们来看一个最简单的Task,打开gradle_demo文件夹下的build.gradle文件,内容如下:

/*
 * This build file was generated by the Gradle 'init' task.
 *
 * This generated file contains a commented-out sample Java project to get you started.
 * For more details take a look at the Java Quickstart chapter in the Gradle
 * user guide available at https://docs.gradle.org/4.1/userguide/tutorial_java_projects.html
 */

/*
// Apply the java plugin to add support for Java
apply plugin: 'java'

// In this section you declare where to find the dependencies of your project
repositories {
    // Use 'jcenter' for resolving your dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}

// In this section you declare the dependencies for your production and test code
dependencies {
    // The production code uses the SLF4J logging API at compile time
    compile 'org.slf4j:slf4j-api:1.7.25'

    // Declare the dependency for your favourite test framework you want to use in your tests.
    // TestNG is also supported by the Gradle Test task. Just change the
    // testCompile dependency to testCompile 'org.testng:testng:6.8.1' and add
    // 'test.useTestNG()' to your build script.
    testCompile 'junit:junit:4.12'
}
*/

这里面全是注释,并没有Task,接下来我们新建一个Task

task helloword << {
    println 'hello gradle!'
}

在与build.gradle相同的目录下执行:

gradle helloword 

结果:


> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)

> Task :helloword
hello gradle!

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

在默认情况下,Gradle将当前目录下的build.gradle文件作为项目的构建文件。在上面的例子中,我们创建了一个名为helloword的Task,在执行gradle命令时,我们指定执行这个helloWorld Task。

Gradle在默认情况下为我们提供了几个常用的Task,比如查看Project的Properties、显示当前Project中定义的所有Task等。可以通过一下命令查看Project中所有的Task:

gradle tasks --all

输出结果:


> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)

> Task :tasks

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

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

Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradle_demo'.
components - Displays the components produced by root project 'gradle_demo'. [incubating]
dependencies - Displays all dependencies declared in root project 'gradle_demo'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradle_demo'.
dependentComponents - Displays the dependent components of components in root project 'gradle_demo'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gradle_demo'. [incubating]
projects - Displays the sub-projects of root project 'gradle_demo'.
properties - Displays the properties of root project 'gradle_demo'.
tasks - Displays the tasks runnable from root project 'gradle_demo'.

Other tasks
-----------
helloword


BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

可看出,除了我们自己定义的helloWorld之外,Gradle还默认为我们提供了dependencies、projects和properties等Task。dependencies用于显示Project的依赖信息,projects用于显示所有Project,包括根Project和子Project,而properties则用于显示一个Project所包含的所有Property。

在默认情况下,Gradle已经为Project添加了很多Property,我们可以调用以下命令进行查看:

gradle properties

输出结果:

> Configure project :
The Task.leftShift(Closure) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use Task.doLast(Action) instead.
        at build_dm49rdwdh0ayv2low2to9ie29.run(/Users/liyang/gradle_demo/build.gradle:33)

> Task :properties

------------------------------------------------------------
Root project
------------------------------------------------------------

allprojects: [root project 'gradle_demo']
ant: org.gradle.api.internal.project.DefaultAntBuilder@76dd470c
antBuilderFactory: org.gradle.api.internal.project.DefaultAntBuilderFactory@5dbbe35f
artifacts: org.gradle.api.internal.artifacts.dsl.DefaultArtifactHandler_Decorated@41de9bb8
asDynamicObject: DynamicObject for root project 'gradle_demo'
baseClassLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@65a1e31b
buildDir: /Users/liyang/gradle_demo/build
buildFile: /Users/liyang/gradle_demo/build.gradle
buildScriptSource: org.gradle.groovy.scripts.UriScriptSource@79d83d84
buildscript: org.gradle.api.internal.initialization.DefaultScriptHandler@7bfb88fb
childProjects: {}
class: class org.gradle.api.internal.project.DefaultProject_Decorated
classLoaderScope: org.gradle.api.internal.initialization.DefaultClassLoaderScope@4e4dcf67
components: SoftwareComponentInternal set
configurationActions: org.gradle.configuration.project.DefaultProjectConfigurationActionContainer@241e448e
configurationTargetIdentifier: org.gradle.configuration.ConfigurationTargetIdentifier$1@1c927994
configurations: configuration container
convention: org.gradle.api.internal.plugins.DefaultConvention@3b0996ad
defaultTasks: []
deferredProjectConfiguration: org.gradle.api.internal.project.DeferredProjectConfiguration@1b1f505c
dependencies: org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler_Decorated@4d735d85
depth: 0
description: null
displayName: root project 'gradle_demo'
ext: org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension@42a2d366
extensions: org.gradle.api.internal.plugins.DefaultConvention@3b0996ad
fileOperations: org.gradle.api.internal.file.DefaultFileOperations@35698961
fileResolver: org.gradle.api.internal.file.BaseDirFileResolver@5415b220
gradle: build 'gradle_demo'
group: 
helloword: task ':helloword'
identityPath: :
inheritedScope: org.gradle.api.internal.ExtensibleDynamicObject$InheritedDynamicObject@35d5252
layout: org.gradle.api.internal.file.DefaultProjectLayout@57b098bc
logger: org.gradle.internal.logging.slf4j.OutputEventListenerBackedLogger@2e6b31aa
logging: org.gradle.internal.logging.services.DefaultLoggingManager@571612f5
modelRegistry: org.gradle.model.internal.registry.DefaultModelRegistry@3eb01587
modelSchemaStore: org.gradle.model.internal.manage.schema.extract.DefaultModelSchemaStore@6d161f95
module: org.gradle.api.internal.artifacts.ProjectBackedModule@739470fa
name: gradle_demo
normalization: org.gradle.normalization.internal.DefaultInputNormalizationHandler_Decorated@1a0785fc
objects: org.gradle.api.internal.model.DefaultObjectFactory@7d61bdf3
parent: null
parentIdentifier: null
path: :
pluginManager: org.gradle.api.internal.plugins.DefaultPluginManager_Decorated@43c393f5
plugins: [org.gradle.api.plugins.HelpTasksPlugin@d968fd4]
processOperations: org.gradle.api.internal.file.DefaultFileOperations@35698961
project: root project 'gradle_demo'
projectConfigurator: org.gradle.api.internal.project.BuildOperationCrossProjectConfigurator@1e74c6af
projectDir: /Users/liyang/gradle_demo
projectEvaluationBroadcaster: ProjectEvaluationListener broadcast
projectEvaluator: org.gradle.configuration.project.LifecycleProjectEvaluator@387a88f8
projectPath: :
projectRegistry: org.gradle.api.internal.project.DefaultProjectRegistry@48042421
properties: {...}
providers: org.gradle.api.internal.provider.DefaultProviderFactory@17075aef
repositories: repository container
resources: org.gradle.api.internal.resources.DefaultResourceHandler@2ffeb71e
rootDir: /Users/liyang/gradle_demo
rootProject: root project 'gradle_demo'
scriptHandlerFactory: org.gradle.api.internal.initialization.DefaultScriptHandlerFactory@432fc751
scriptPluginFactory: org.gradle.configuration.ScriptPluginFactorySelector@2ae3d639
serviceRegistryFactory: org.gradle.internal.service.scopes.ProjectScopeServices$4@79e21a8
services: ProjectScopeServices
standardOutputCapture: org.gradle.internal.logging.services.DefaultLoggingManager@571612f5
state: project state 'EXECUTED'
status: release
subprojects: []
tasks: task set
version: unspecified


BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

在以上Property中,allprojects表示所有的Project,这里只包含一个根Project,在多项目构建中,它将包含多个Project;buildDir表示构建结果的输出目录;我们自己定义的helloWorld和copyFile也成为了Project中的Property。另外,Project还包括用于执行Ant命令的DefaultAntBuilder(Property名为ant)和Project的描述属性description。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 是什么? 在语法上是基于Groovy语言的(Groovy 是一种基于JVM的敏捷开发语言,可以简单的理解为强类型语...
    千山万水迷了鹿阅读 99,573评论 4 122
  • 参考资料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter阅读 11,001评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,673评论 18 139
  • Gradle简介 Gradle是一个构建工具,同时它也是一个编程框架。 当你把Gradle当构建工具看的时候,我们...
    Rangethan阅读 2,322评论 1 8
  • 这篇文章讲给大家带来gradle打包系列中的高级用法-自己动手编写gradle插件。我们平常在做安卓开发时,都会在...
    呆萌狗和求疵喵阅读 15,986评论 22 80