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. linux 内核编译错误 Makefile:416: *** mixed implicit and normal rules: deprecated syntax
  2. java 互斥量_什么是Java中的互斥和信号量?主要区别是什么?
  3. lvs+keepalived实现负载均衡
  4. 全球及中国偶联单克隆抗体行业深度调研及项目风险评估报告2021-2027年
  5. 局域网限速软件_2号破解app重器推荐一款强大的快捷软件
  6. Linux Epoll ET模式EPOLLOUT和EPOLLIN触发时刻
  7. asp.net mvc 点滴 一 asp.net mvc vs asp.net web forms
  8. mysql sqlserver alter语句区别_SQL ALTER
  9. keepalived详解和实战
  10. Eclipse中Maven WEB工程tomcat调试
  11. rsync使用(二)
  12. 虚拟机管理程序、虚拟化和云: 深入剖析 PowerVM 虚拟机管理程序
  13. jsp+servlet+mysql的简单使用
  14. MacroSAN杭州宏杉科技存储使用小节
  15. 如何生成网站地图(Sitemap)
  16. linux下r语言画图,linux命令行下使用R语言绘图实例讲解
  17. GBS国标经纬度转高德经纬度
  18. 西餐餐饮文化、简单鸡尾酒调制~~DIY的力量无穷
  19. 部分可重构系统中可能发生的几个不良现象及解决方法(解耦) Xilinx FPGA DFX Partial Reconfig Decouple
  20. C语言男性标准体重,2019男人标准体重表!

热门文章

  1. 360数科张家兴:金融科技的本质是线上化和自动化
  2. 做到这 3 点,斩获 BAT Offer 不是梦
  3. 倒计时2天 | AI开发者大会完整议程揭秘!与百名大咖玩转人工智能
  4. 华为全球分析师大会:HMS Core全球开发者应用集成的数量加速增长,打造全场景智慧体验...
  5. 因为造轮子,我一个月就转正了 | 原力计划
  6. 2019 年,C# 还值得学习吗?
  7. 软件正在吞噬世界!如何拯救旧金山的开发者?
  8. 苹果 5G 掉队?!
  9. 均薪连续三年过万,北上深人才需求大 !| 5G 人才报告
  10. Python 爬取 620 首虾米歌曲,揭秘五月天为什么狂吸粉?!