Gradle学习之使用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自己引入的。

(1)java Plugin引入的主要Task
执行“gradle build”,我们已经可以看到java Plugin所引入的主要Task:
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
 
BUILD SUCCESSFUL
 
Total 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文件时的文件名称。

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

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

(3)配置已有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默认的目录结构。

(4)创建新的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中的类。

时间: 2024-08-27 22:23:44

Gradle学习之使用java plugin的相关文章

Gradle学习之Eclipse构建Gradle工程

在 eclipse 下利用 gradle 构建系统 本文为转载:http://www.ibm.com/developerworks/cn/opensource/os-cn-gradle/ 基本开发环境 操作系统:本教程使用的为 Windows Vista Enterprise, 如果您的系统是 Linux 的,请选择下载对应版本的其他工具,包括开发工具.Java EE 服务器.Apache Ant.SoapUI. 开发工具:Eclipse IDE for SOA Developers 版本,请到

Gradle学习系列之一——Gradle快速入门(转)

  这是一个关于Gradle的学习系列,其中包含以下文章: Gradle快速入门 创建Task的多种方法 读懂Gradle语法 增量式构建 自定义Property 使用java Plugin 依赖管理 构建多个Project 自定义Task类型 自定义Plugin   请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git     和Maven一样,Gradle只是提供了构建项目的一

Gradle学习之第一步入门操作

请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git     和Maven一样,Gradle只是提供了构建项目的一个框架,真正起作用的是Task和Plugin.Gradle在默认情况下为我们提供了许多常用的Plugin,其中包括有构建Java项目的Plugin,还有War,Ear等.与Maven不同的是,Gradle不提供内建的项目生命周期管理,只是java Plugin向Proj

如何使用gradle将一个混合了java和groovy代码的web项目打war包?

问题描述 如何使用gradle将一个混合了java和groovy代码的web项目打war包? 如题,我现在自己尝试,遇到的问题是在编译的时候java类和groovy类都能被正确的 编译成class文件. 但是使用gradle打war包的时候,groovy的class文件都没有打包进去. 希望有高手来指点一下,谢谢. 顺便附上build.gradle文件内容: apply plugin: 'war' apply plugin: 'groovy' apply plugin: 'eclipse-wtp

char-新人在学习Thinking in java 中遇到的一点问题拜托大家来帮帮忙

问题描述 新人在学习Thinking in java 中遇到的一点问题拜托大家来帮帮忙 // Implementing an interface to conform to a method import java.nio.*; import java.util.*; public class RandomWords implements Readable{ private static Random rand = new Random(); //24位大写字母 private static f

学习笔记之JAVA图形设计卷I AWT——第3章 图 形

   学习笔记之JAVA图形设计卷I AWT--第3章 图 形 前时显示器坏了,file://写前言:我觉得写的不是学习笔记,倒象教程.我是想让有所获,故详细了点.注意1:在AWT中提供的用户接口构件(如按钮.列表.菜单.对话框等)不包含一些类似的纯粹的绘制图形的对象(如Line或Circle类) 详细意思:由于原始的AWT在设计时不允许纯粹的绘制图形的对象,那么Rectangle.Polygon和Point没有任何绘制图形的能力.换句话说,Rectangle.Polygon和Point不具备d

Java 查看器 和 Java Plug-in 查看器之间的区别

本文中的知识涉及: 水晶报表 9适用于:所有版本Java 查看器比较大纲 某些 Crystal Decisions 产品提供两种Java 查看器: · (智能) Java 查看器 · Java Plug-in 查看器 这两种查看器之间的有什么区别呢? 解决方案 当你选择"(智能) Java 查看器"时,你正在使用浏览器内置的 Java 虚拟机 (JVM) 所提供的查看器 applet. ·如果你的浏览器是 internet Explorer,你或许使用的是 Microsoft JVM.

请问谁有 Java Plug-in Framework (Jpf) 学习资料

问题描述 请问谁有JavaPlug-inFramework的使用经验或学习资料,能不能分享一下,谢谢. 解决方案 解决方案二:建议还是从人家官方网站的资料学起.

Gradle学习之自定义属性

请通过以下方式下载本系列文章的Github示例代码: git clone https://github.com/davenkin/gradle-learning.git     在前面的文章中我们讲到,设置和读取Project的Property是使用Gradle的一个很重要的方面.比如,很多Plugin都会向Project中加入额外的Property,在使用这些Plugin时,我们需要对这些Property进行赋值.   Gradle在默认情况下已经为Project定义了很多Property,其