Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1296|回复: 0

[默认分类] Gradle学习系列之一——Gradle快速入门

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-7 11:58:12 | 显示全部楼层 |阅读模式
    这是一个关于Gradle的学习系列,其中包含以下文章:


      
       Gradle快速入门
       创建Task的多种方法
       读懂Gradle语法
       增量式构建
       自定义Property
       使用java Plugin
       依赖管理
       构建多个Project
       自定义Task类型
       自定义Plugin
      



      
      请通过以下方式下载本系列文章的Github示例代码:

    1. git clone https://github.com/davenkin/gradle-learning.git
    复制代码





      和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Plugin。Gradle在默认情况下为我们提供了许多常用的Plugin,其中包括有构建java项目的Plugin,还有War,Ear等。与Maven不同的是,Gradle不提供内建的项目生命周期管理,只是java Plugin向Project中添加了许多Task,这些Task依次执行,为我们营造了一种如同Maven般项目构建周期。更多有关Maven的知识,读者可以访问Maven官网,或者可以参考笔者写的Maven学习系列文章

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

    1. task helloWorld << {
    2. println "Hello World!"
    3. }
    复制代码


      这里的“<<”表示向helloWorld中加入执行代码——其实就是groovy代码。Gradle向我们提供了一整套DSL,所以在很多时候我们写的代码似乎已经脱离了groovy,但是在底层依然是执行的groovy。比如上面的task关键字,其实就是一个groovy中的方法,而大括号之间的内容则表示传递给task()方法的一个闭包。除了“<<”之外,我们还很多种方式可以定义一个Task,我们将在本系列后续的文章中讲到。
      在与build.gradle相同的目录下执行:

    1. gradle helloWorld
    复制代码


      命令行输出如下:

    1. :helloWorld
    2. Hello World!
    3. BUILD SUCCESSFUL
    4. Total time: 2.544 secs
    复制代码


      在默认情况下,Gradle将当前目录下的build.gradle文件作为项目的构建文件。在上面的例子中,我们创建了一个名为helloWorld的Task,在执行gradle命令时,我们指定执行这个helloWorld Task。这里的helloWorld是一个DefaultTask类型的对象,这也是定义一个Task时的默认类型,当然我们也可以显式地声明Task的类型,甚至可以自定义一个Task类型(我们将在本系列的后续文章中讲到)。
      比如,我们可以定义一个用于文件拷贝的Task:

    1. task copyFile(type: Copy) {
    2. from "xml"
    3. into "destination"
    4. }
    复制代码


      以上copyFile将xml文件夹中的所有内容拷贝到destination文件夹中。这里的两个文件夹都是相对于当前Project而言的,即build.gradle文件所在的目录。
      Task之间可以存在依赖关系,比如taskA依赖于taskB,那么在执行taskA时,Gradle会先执行taskB,然后再执行taskA。声明Task依赖关系的一种方式是在定义一个Task的时候:

    1. task taskA(dependsOn: taskB) {
    2. //do something
    3. }
    复制代码



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

    1. gradle tasks
    复制代码


      输出如下:

    1. :tasks
    2. ------------------------------------------------------------
    3. All tasks runnable from root project
    4. ------------------------------------------------------------
    5. Build Setup tasks
    6. -----------------
    7. setupBuild - Initializes a new Gradle build. [incubating]
    8. wrapper - Generates Gradle wrapper files. [incubating]
    9. Help tasks
    10. ----------
    11. dependencies - Displays all dependencies declared in root project "gradle-blog".
    12. dependencyInsight - Displays the insight into a specific dependency in root project "gradle-blog".
    13. help - Displays a help message
    14. projects - Displays the sub-projects of root project "gradle-blog".
    15. properties - Displays the properties of root project "gradle-blog".
    16. tasks - Displays the tasks runnable from root project "gradle-blog".
    17. Other tasks
    18. -----------
    19. copyFile
    20. helloWorld
    21. To see all tasks and more detail, run with --all.
    22. BUILD SUCCESSFUL
    23. Total time: 2.845 secs
    复制代码


      可以看到,除了我们自己定义的copyFile和helloWorld之外,Gradle还默认为我们提供了dependencies、projects和properties等Task。dependencies用于显示Project的依赖信息,projects用于显示所有Project,包括根Project和子Project,而properties则用于显示一个Project所包含的所有Property。
      在默认情况下,Gradle已经为Project添加了很多Property,我们可以调用以下命令进行查看:

    1. gradle properties
    复制代码


      输出如下:

    1. :properties
    2. ------------------------------------------------------------
    3. Root project
    4. ------------------------------------------------------------
    5. allprojects: [root project "gradle-blog"]
    6. ant: org.gradle.api.internal.project.DefaultAntBuilder@1342097
    7. buildDir: /home/davenkin/Desktop/gradle-blog/build
    8. buildFile: /home/davenkin/Desktop/gradle-blog/build.gradle
    9. ...
    10. configurations: []
    11. convention: org.gradle.api.internal.plugins.DefaultConvention@11492ed
    12. copyFile: task ":copyFile"
    13. ...
    14. ext: org.gradle.api.internal.plugins.DefaultExtraPropertiesExtension@1b5d53a
    15. extensions: org.gradle.api.internal.plugins.DefaultConvention@11492ed
    16. ...
    17. helloWorld: task ":helloWorld"
    18. ...
    19. plugins: [org.gradle.api.plugins.HelpTasksPlugin@7359f7]
    20. project: root project "gradle-blog"
    21. ...
    22. properties: {...}
    23. repositories: []
    24. tasks: [task ":copyFile", task ":helloWorld"]
    25. version: unspecified
    26. BUILD SUCCESSFUL
    27. Total time: 2.667 secs
    复制代码


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

      在下一篇文章中,我们将讲到创建Task的多种方法。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-24 01:24 , Processed in 0.363819 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表