标准的Project带来了一些功能,但还不足以用来构建产品项目。Gradle提供了一些核心插件,帮助开发Java、JavaEE或者Android项目。
插件的使用主要分两步,第一步是解析插件,这一过程是用来查到插件的正确版本并将其添加到构建脚本的classpath中。Gradle核心插件以及脚本插件都是自解析的。第二步是应用插件,主要是对Project执行Plugin.apply(T)方法。应用插件是幂等的,可以对Project多次apply同一个插件,没有任何副作用。
先来认识下几个Java相关的插件:
java
插件java是Gradle中JavaPlugin的简称,可以通过下面两种方式来使用java插件:
plugins {
id 'java'
}
apply plugin: 'java'
// 或者 apply plugin: JavaPlugin
java插件相关的task
有些是java插件添加的,有些是来自于BasePlugin,常用的task如下:
java 默认约定的项目结构
src/main/java 产品源代码目录
src/main/resources 配置文件或者属性文件目录等
src/test/java 测试源代码
src/test/resources 测试用的配置文件或者属性文件等
src/sourceSet/java
src/sourceSet/resources
main 和test两个跟maven约定一样,默认的代码和资源文件都可以修改:
sourceSets {
main {
java {
srcDirs = ['src/testJavaMain/java']
}
resources {
srcDirs = ['src/testJavaMain/resources']
}
}
}
新增一个sourceSet
src/sourceSet/java 并不是说目录名称是sourceSet,而是我们可以在sourceSets 增加一个除main和test之外的sourceSet的名称:
sourceSets {
testSet {
java {
srcDirs = ['src/testSet/java']
}
resources {
srcDirs = ['src/testSet/resources']
}
}
}
添加了新的testSet 之后,可以看到新增了三个task:
- compileTestSetJava - Compiles test set Java source
- processTestSetResources - Processes test set resources
- testSetClasses - Assembles test set classes
将上面task名称中testSet换成test就是标准java插件test用的task,直接去掉testSet那就是main所用的task。新增的sourceSet跟标准的test有很多相似之处,但是新增的sourceSet在默认情况下,相关的task不会依赖main相关的task, 当执行gradle testSetClasses -i时,可以看到:
# gradle testSetClasses -i
Selected primary task 'testSetClasses' from project :
Tasks to be executed: [task ':compileTestSetJava', task ':processTestSetResources', task ':testSetClasses']
默认的test的testClasses 依赖于main相关的任务
# gradle testClasses -i
Selected primary task 'testClasses' from project :
Tasks to be executed: [task ':compileJava', task ':processResources', task ':classes', task ':compileTestJava', task ':processTestResources', task ':testClasses']
可以通过配置来改进:
sourceSets {
testSet {
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
}
}
dependencies {
testSetImplementation 'junit:junit:4.13'
}
这时候,新增的sourceSet 相关的task跟main就相关了:
# gradle testSetClasses -i
Selected primary task 'testSetClasses' from project :
Tasks to be executed: [task ':compileJava', task ':processResources', task ':classes', task ':compileTestSetJava', task ':processTestSetResources', task ':testSetClasses']
关于引入新的sourceSet的作用,可以参考官网提供集成测试的例子
依赖管理配置
java插件提供了一些依赖配置,用来引入并管理第三方库,这里列举几个常用的:
- implementation, 仅在项目内部使用,编译和运行都有效
- compileOnly,仅在编译时有效,不会在运行时包含,比如servletAPI
- runtimeOnly, 仅在运行时有效,比如
- testImplementation ,测试代码引用外部依赖
- testCompileOnly,测试代码编译时有效
- testRuntimeOnly, 测试代码运行时有效
java-library
java-library 插件扩展了java插件,一个很大的不同是提供了api这类依赖配置,api相对于implementation来说,api依赖的第三方库,可以作为当前模块的一部分继续暴露出去。
java-library-distribution
增加了一个名叫distZip的task,它可以将项目以及其依赖打包成zip文件或tar文件。
application
application 插件允许指定主类或者参数:
application {
mainClass = 'org.gradle.sample.Main'
applicationDefaultJvmArgs = ['-Dgreeting.language=en']
}
此插件可以将项目打包zip,并为程序执行提供了启动脚本,包括linux和windows启动脚本;
war
war 扩展了java插件,在标准java项目结构中新增了web资源文件的目录:
src/main/webapp
还提供了两个新的依赖配置:
- providedCompile
- providedRuntime
更多详情参见官网WAR
maven-publish
新增一些发布至maven仓库的task:
group = 'org.example'
version = '1.0'
publishing {
publications {
myLibrary(MavenPublication) {
from components.java
}
}
repositories {
maven {
name = 'myRepo'
url = layout.buildDirectory.dir("repo")
}
}
}
gretty
第三方插件里面有个很有用的插件gretty,提供了web项目运行的容器,比如tomcat或jetty。因为是非Gradle核心插件,所以需要指定全名,以及版本:
plugins {
id 'war'
id "org.gretty" version "3.0.6"
}
gretty插件提供给很多容器运行和停止的task,比如appRun、appRunDebug等。
appRunDebug 是个很有用的task,使用它启动容器,可以看到:
(base) ➜ test_jetty git:(master) ✗ gradle appRunDebug
Listening for transport dt_socket at address: 5005
十一月 03, 2021 8:40:55 下午 org.springframework.web.servlet.FrameworkServlet initServletBean
信息: Initializing Servlet 'springApp'
在idea中配置Remote JVM Debug,设定好地址localhost和端口号5005,就可以监控web项目的运行,添加断点等等操作。