Gradle7.x学习篇04 - 认识Plugin

标准的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如下:

clean
compileJava
classes
processResources
compileTestJava
testClassess
processTestResources
testClasses
test
jar
javadoc
assemble
check
build

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项目的运行,添加断点等等操作。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值