博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Gradle学习系列之六——使用Java Plugin
阅读量:4885 次
发布时间:2019-06-11

本文共 2949 字,大约阅读时间需要 9 分钟。

  在的中,我们讲到了如何自定义Property,在本篇文章中,我们将讲到如何使用java Plugin。

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

git clone https://github.com/davenkin/gradle-learning.git

 


  Gradle最常用的Plugin便是java Plugin了。和其他Plugin一样,java Plugin并没有什么特别的地方,只是向Project中引入了多个Task和Property。当然,java Plugin也有比较与众不同的地方,其中之一便是它在项目中引入了构建生命周期的概念,就像Maven一样。但是,和Maven不同的是,Gradle的项目构建生命周期并不是Gradle的内建机制,而是由Plugin自己引入的。

 

(一)java Plugin引入的主要Task

  执行“gradle build”,我们已经可以看到java Plugin所引入的主要Task:

:compileJava:processResources:classes:jar:assemble:compileTestJava:processTestResources:testClasses:test:check:buildBUILD SUCCESSFULTotal time: 4.813 secs

   build也是java Plugin所引入的一个Task,它依赖于其他Task,其他Task又依赖于另外的Task,所以有了以上Task执行列表。以上Task执行列表基本上描述了java Plugin向项目中所引入的构建生命周期概念。

  除了定义众多的Task外,java Plugin还向Project中加入了一些额外的Property。比如,sourceCompatibility用于指定在编译Java源文件时所使用的Java版本,archivesBaseName用于指定打包成Jar文件时的文件名称。

 

(二)Java项目的目录结构

  在默认情况下,Gradle采用了与Maven相同的Java项目目录结构:

 

  关于Maven标准目录结构,请参考。当然,跟Maven一样,以上只是默认的目录结构,我们可以通过配置来修改这些目录结构。

(三)配置已有source set  

  Gradle在采用了Maven目录结构的同时,还融入了自己的一些概念,即source set。对于上图中的目录结构,Gradle实际上为我们创建了2个source set,一个名为main,一个名为test。  

  请注意,这里的source set的名字main与上图目录结构中的main文件夹并无必然的联系,只是在默认情况下,Gradle为了source set概念到文件系统目录结构的映射方便,才采用了相同的名字。对于test, 也是如此。我们完全可以在build.gradle文件中重新配置这些source set所对应的目录结构,同时,我们还可以创建新的source set。

  从本质上讲,Gradle的每个source set都包含有一个名字,并且包含有一个名为java的Property和一个名为resources的Property,他们分别用于表示该source set所包含的Java源文件集合和资源文件集合。在实际应用时,我们可以将他们设置成任何目录值。比如,我们可以重新设置main的目录结构:

sourceSets {   main {      java {         srcDir 'java-sources'      }      resources {         srcDir 'resources'      }   }}

 

  此时所对应的项目目录结构如下:

  我们重新设置了main的目录结构,而对于test,我们保留了Gradle默认的目录结构。

(四)创建新的source set

  要创建一个新的source set也是非常简单的,比如,我们可以创建一个名为api的source set来存放程序中的接口类:

sourceSets {   api}

 

  当然,以上配置也可以与main放在一起。在默认情况下,该api所对应的Java源文件目录被Gradle设置为${path-to-project}/src/api/java,而资源文件目录则被设置成了${path-to-project}/src/api/resources。我们也可以像上面的main一样重新对api的目录结构进行配置。

  Gradle会自动地为每一个新创建的source set创建相应的Task,创建规律为:对于名为mySourceSet的source set,Gradle将为其创建compile<mySourceSet>Java、process<mySourceSet>Resources和<mySourceSet>Classes这3个Task。对于这里api而言,Gradle会为其创建名为compileApiJava、processApiResource和apiClasses Task。我们可以在命令行中执行"gradle apiClasses"。

  你可能会注意到,对于main而言,Gradle并没有相应的compileMainJava,原因在于:由于main是Gradle默认创建的source set,并且又是及其重要的source set,Gradle便省略掉了其中的“Main”,而是直接使用了compileJava作为main的编译Task。对于test来说,Gradle依然采用了compileTestJava。

  通常的情况是,我们自己创建的名为api的source set会被其他source set所依赖,比如main中的类需要实现api中的某个接口等。此时我们需要做两件事情。第一,我们需要在编译main之前对api进行编译,即编译main中Java源文件的Task应该依赖于api中的Task:

classes.dependsOn apiClasses

 

  第二,在编译main时,我们需要将api编译生成的class文件放在main的classpath下。此时,我们可以对main和test做以下配置:

sourceSets {   main {      compileClasspath = compileClasspath + files(api.output.classesDir)   }   test {      runtimeClasspath = runtimeClasspath + files(api.output.classesDir)   }}

 

  之所以需要对test的runtimeClasspath进行设置,是因为在运行测试时我们也需要加载api中的类。

 

  在文章中,我们将讲到如何管理依赖。

转载于:https://www.cnblogs.com/davenkin/p/gradle-learning-6.html

你可能感兴趣的文章
如何在SpringBoot中集成JWT(JSON Web Token)鉴权
查看>>
python的pydoc与help
查看>>
js动画实现透明度动画
查看>>
css3实现圆形逐渐减少动画
查看>>
D24_02_页面驻留(page Frame)
查看>>
基于Boost无锁队列实现的内存池
查看>>
HDU-4861-Couple doubi(数学题,难懂!难懂!)
查看>>
sublime text 输入法不跟随光标
查看>>
java多态
查看>>
highchart 图标 时钟的使用
查看>>
牛客OI赛制测试赛2(0906)
查看>>
1005—I Think I Need a Houseboat
查看>>
java的Timer定时器任务
查看>>
第6章 当c++爱上面向对象
查看>>
hadoop伪分布式环境搭建
查看>>
广域网远程开机教程 测试
查看>>
爬取大众点评
查看>>
LeetCode 66. Plus One
查看>>
Sharepoint学习笔记—ECMAScript对象模型系列-- 10、 复制/移动Document List中的文档
查看>>
Routed Events【pluralsight】
查看>>