Gradle 插件

Gradle 在它的核心中有意地提供了一些小但有用的功能,用于在真实世界中的自动化。所有有用的功能,例如以能够编译 Java 代码为例,都是通过插件进行添加的。插件添加了新任务 (例如JavaCompile),域对象 (例如SourceSet),约定(例如主要的 Java 源代码是位于 src/main/java),以及扩展的核心对象和其他插件的对象。

在这一章中,我们将讨论如何使用插件以及术语和插件相关的概念。

应用插件

插件都认为是被应用,通过 Project.apply() 方法来完成。

应用插件

build.gradle

apply plugin: 'java'

插件都有表示它们自己的一个短名称。. 在上述例子中,我们使用短名称 java 去应用 JavaPlugin。

我们还可以使用下面的语法:

通过类型应用插件

build.gradle

apply plugin: org.gradle.api.plugins.JavaPlugin

由于 Gradle 的默认导入,您还可以这样写:

通过类型应用插件

build.gradle

apply plugin: JavaPlugin

插件的应用是幂等的。也就是说,一个插件可以被应用多次。如果以前已应用了该插件,任何进一步的应用都不会再有任何效果。

一个插件是任何实现了 Plugin 接口的简单的类。Gradle 提供了核心插件作为其发行包的一部分,所以简单地应用如上插件是你所需要做的。然而,对于第三方插件,你需要进行配置以使插件在构建类路径中可用。有关如何进行此操作的详细信息。

插件都做了什么

把插件应用到项目中可以让插件来扩展项目的功能。它可以做的事情如:

将任务添加到项目 (如编译、 测试)

使用有用的默认设置对已添加的任务进行预配置。

向项目中添加依赖配置 (见“依赖配置”)。

通过扩展对现有类型添加新的属性和方法。

让我们来看看:

通过插件添加任务

build.gradle

apply plugin: 'java'

task show << {

println relativePath(compileJava.destinationDir)

println relativePath(processResources.destinationDir)

}

gradle -q show 的输出结果

> gradle -q show

build/classes/main

build/resources/main

Java 插件已经向项目添加了 compileJava 任务和 processResources 任务,并且配置了这两个任务的 destinationDir 属性。

约定

插件可以通过智能的方法对项目进行预配置以支持约定优于配置。Gradle 对此提供了机制和完善的支持,而它是强大-然而-简洁的构建脚本中的一个关键因素。

在上面的示例中我们看到,Java 插件添加了一个任务,名字为 compileJava ,有一个名为 destinationDir 的属性(即配置编译的 Java 代码存放的地方)。Java 插件默认此属性指向项目目录中的 build/classes/main。这是通过一个合理的默认的约定优于配置的例子。

我们可以简单地通过给它一个新的值来更改此属性。

更改插件的默认设置

build.gradle

apply plugin: 'java'

compileJava.destinationDir = file("$buildDir/output/classes")

task show << {

println relativePath(compileJava.destinationDir)

}

gradle -q show 的输出结果

> gradle -q show

build/output/classes

然而,compileJava 任务很可能不是唯 一需要知道类文件在哪里的任务。

Java 插件添加了 source sets 的概念 (见SourceSet) 来描述的源文件集的各个方面,其中一个方面是在编译的时候这些类文件应该被写到哪个地方。Java 插件将 compileJava 任务的 destinationDir 属性映射到源文件集的这一个方面。

我们可以通过这个源码集修改写入类文件的位置。

插件中的约定对象

build.gradle

apply plugin: 'java'

sourceSets.main.output.classesDir = file("$buildDir/output/classes")

task show << {

println relativePath(compileJava.destinationDir)

}

gradle -q show 的输出结果

> gradle -q show

build/output/classes

在上面的示例中,我们应用 Java 插件,除其他外,还做了下列操作:

添加了一个新的域对象类型: SourceSet

通过属性的默认(即常规)配置了 main 源码集

配置支持使用这些属性来执行工作的任务

所有这一切都发生在 apply plugin: "java" 这一步过程中。在上面例子中,我们在约定配置被执行之后,修改了类文件所需的位置。在上面的示例中可以注意到,compileJava.destinationDir 的值也被修改了,以反映出配置的修改。

考虑一下另一种消费类文件的任务的情况。如果这个任务使用 sourceSets.main.output.classesDir 的值来配置,那么修改了这个位置的值,无论它是什么时候被修改,将同时更新 compileJava 任务和这一个消费者任务。

这种配置对象的属性以在所有时间内(甚至当它更改的时候)反映另一个对象的任务的值的能力被称为“映射约定”。它可以令 Gradle 通过约定优于配置及合理的默认值来实现简洁的配置方式。而且,如果默认约定需要进行修改时,也不需要进行完全的重新配置。如果没有这一点,在上面的例子中,我们将不得不重新配置需要使用类文件的每个对象。

gradle 修改java代码_Gradle 插件相关推荐

  1. gradle 修改java代码_自定义一个gradle插件动态修改jar包Class文件

    动态修改jar包中的class文件,预埋占位符字符串,在编译代码时动态植入要修改的值.记录一下整个过程及踩过的坑. 创建一个Android项目,再创建一个Android library,删掉里面所有代 ...

  2. JavaParser生成,分析和修改Java代码

    作为开发人员,我们经常鄙视手动进行重复工作的人员. 我们认为, 他们应该实现这一目标 . 尽管如此,我们还是进行与编码有关的所有活动. 当然,我们使用的高级IDE可以为我们执行一些重构,但这基本上就是 ...

  3. idea+tomcat实现热部署-修改java代码及时生效

    前言: 实现效果,修改java后端代码不必重启tomcat,实现热部署. (修改保存代码,要等几秒钟就可以生效了,我这边大概5s) 此文章也是在我测试完全没问题之后,回想我的配置过程所写的文章. 一. ...

  4. idea每次修改java都要重启_IDEA修改java代码、Thymeleaf的html模板需要重启

    背景:近期开发java应用由eclipse转移到IDEA,也是受周围人的影响,本来使用eclipse感觉也不错,索性为了方便开发协作,也试试使用IDEA 问题:开发调试过程中,修改java代码或者ht ...

  5. eclipse 修改java代码不重启服务器 生效配置

       1.本文目的:用tomcat进行web开发时,修改Java代码往往要重启代码,当工程较大启动较慢时,严重影响效率,本文通过eclipse下tomcat开发和发布web程序时,对一些Java代码一 ...

  6. 9月26日云栖精选夜读:阿里Java代码规约插件即将全球首发,邀您来发布仪式现场...

    10月14日,杭州云栖大会研发效能峰会场,阿里将正式对外开放Java代码规约插件及源码. 热点热议 阿里Java代码规约插件即将全球首发,邀您来发布仪式现场 作者:云效平台   发表在:阿里云效平台 ...

  7. Eclipse解决每次修改java代码或jsp代码服务器重启问题的解决办法

    1.面临的问题:     Eclipse有点非常不友好,就是不管我怎么修改Java代码,哪怕只有仅仅一行代码都需要重新启动,才能使修改代码生效.   由于我们项目较大,这点严重影响了我的工作效率,本文 ...

  8. MyEclipse中阿里JAVA代码规范插件(P3C)的安装及使用

    JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...

  9. idea的maven项目修改java代码重启后无效

    修改java代码必须先clean下maven项目后重新运行才能生效,否则修改java代码重启后还是等于没重启,从class文件看出来根本没编译.还是老代码,所以确定是这问题,在idea的maven设置 ...

最新文章

  1. UA MATH571B 试验设计 总结 试验的类型与选择
  2. 【OpenCV3】级联分类器目标检测——cv::CascadeClassifier简介
  3. 7 centos ssh 单机_虚拟机下CentOS7 开启SSH连接
  4. codeforces 1027 B - Numbers on the Chessboard(规律)
  5. Objective-C优缺点
  6. 计算机文本处理竞赛题目,文字处理竞赛题目(word2010).pdf
  7. 信息学奥赛C++语言:时间转换
  8. HDFS概述(6)————用户手册
  9. 《C#并发编程经典实例》学习笔记—2.1 暂停一段时间
  10. 大数据做基础 构建流动人口健康屏障
  11. python dlib opencv人脸识别准确度_Dlib+OpenCV深度学习人脸识别
  12. CSND博客☞盘码之路开始
  13. Java中resualtset,@Result type = 'stream
  14. 微信视频号下载短视频的步骤
  15. pyqt5:利用QFileDialog从本地选择图片\文本文档显示到label、保存图片\label文本到本地(附代码)
  16. Vue 移动端项目 百度地图 点击事件无效、不触发 解决方案
  17. WebAPI第四天学习总结—— 常见网页特效案例(轮播图、节流阀、返回顶部、筋斗云案例)
  18. 基于快速傅里叶变换实现的狗声识别器(人工智能)
  19. 爬取百度地图 商店铺联系电话地址定位
  20. 运用广告监测系统,上海发布十二起违法广告典型案例-十目监测

热门文章

  1. 阿里回应被列为被执行人;Linus Torvalds:我已经不是程序员;Ant Design 4.4.1 发布 | 极客头条
  2. 我写了一个“文本转手写”神器来搞定作业!
  3. 别人在加薪,你却在加班?快到这里和聪明的小伙伴一起充电吧!
  4. 成为一名斜杠程序员,你还差点什么?
  5. 深度学习专项课程精炼图笔记!必备收藏 | 原力计划
  6. 阿里云存储负责人吴结生:安全可靠是云存储立身之本, 智能技术将激活存储技术新变革...
  7. 汲取 IE6、IE8 消亡的经验,如何“杀死” IE11?
  8. 雷军:小米生死靠技术!
  9. 意大利不禁止华为;13 款 5G 手机时间表公布;亚马逊 CEO 遭威胁 | 极客头条
  10. Google 强迫微软弃用 Edge 内核?