2024-07-01
欲买桂花同载酒,荒泷天下第一斗。 --- 《原神》 · 鱼鱼
今天看了一下gradle-jooq-plugin的源码来学习一下gradle和gradle插件
settings.gradle
因为不打算使用 Gralde Enterprise
,所以忽略了相关配置
这段代码是一个Gradle配置文件,主要用于配置缓存设置。下面是对每一部分的详细讲解:
plugins {
id 'org.gradle.toolchains.foojay-resolver-convention' version '0.8.0'
}
这一部分是插件声明
org.gradle.toolchains.foojay-resolver-convention
:用于工具链解析的插件。
buildCache {
local {
enabled = true
}
}
这一部分是构建缓存的配置:
local { enabled = true }
:启用了本地缓存。
rootProject.name = 'gradle-jooq-plugin'
最后一行设置了根项目的名称为 gradle-jooq-plugin
。
gradle.properties
gradle.properties
文件是Gradle项目的配置文件,用于定义全局属性和设置。这些设置可以影响整个构建过程的行为。具体来说,这个文件中定义的三个属性的作用如下:
-
org.gradle.caching=true
- 作用:启用构建缓存。
- 详细说明:构建缓存可以显著加快构建速度,通过存储和重用以前构建过的任务的输出结果。如果某些任务的输入和环境没有变化,Gradle可以直接使用缓存中的结果,而不需要重新执行这些任务。
-
org.gradle.parallel=true
- 作用:启用并行构建。
- 详细说明:并行构建允许Gradle同时执行多个独立的任务 ,这样可以充分利用多核处理器的性能,缩短构建时间。这对于大型项目尤为有用,可以显著提高构建效率。
-
org.gradle.jvmargs=-Duser.language=en -Duser.country=US -Dfile.encoding=UTF-8
- 作用:配置JVM参数。
- 详细说明:这行设置了JVM的启动参数,具体包括:
-Duser.language=en
:设置语言为英语。-Duser.country=US
:设置国家为美国。-Dfile.encoding=UTF-8
:设置文件编码为UTF-8。
- 影响:这些设置确保构建过程使用统一的语言、区域设置和文件编码,避免由于不同的语言、区域设置或文件编码导致的构建问题或结果不一致。
总结来说,这些设置是为了优化构建性能和确保构建环境的一致性。启用构建缓存和并行构建可以加快构建速度,而统一的JVM参数设置则可以确保构建过程中的一致性和稳定性。
org.gradle.caching
和 org.gradle.parallel=
默认都是 false
build.gradle
这段代码是一个Gradle构建脚本,用于配置一个Java Gradle插件项目。以下是详细讲解:
插件声明
plugins {
id 'java-gradle-plugin'
id 'com.gradle.plugin-publish' version '1.2.1'
id 'org.nosphere.gradle.github.actions' version '1.4.0'
id 'groovy'
}
java-gradle-plugin
: 用于开发Gradle插件的插件。com.gradle.plugin-publish
: 用于发布Gradle插件的插件。org.nosphere.gradle.github.actions
: 用于在GitHub Actions中使用Gradle的插件。groovy
: 添加对Groovy语言的支持。
项目属性
group = 'nu.studer'
version = '9.0.1-DEV'
group
: 项目的组织标识。version
: 项目的版本号。
配置依赖解析策略
configurations.all { Configuration c ->
c.resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'jakarta.xml.bind' && details.requested.name == 'jakarta.xml.bind-api') {
details.useVersion '3.0.1'
}
}
}
- 强制将
jakarta.xml.bind:jakarta.xml.bind-api
依赖的版本设置为3.0.1
。
仓库配置
repositories {
mavenCentral()
}
- 使用
Maven Central
作为依赖的仓库。
依赖声明
dependencies {
api 'org.jooq:jooq-codegen:3.19.1'
runtimeOnly 'org.glassfish.jaxb:jaxb-core:3.0.2'
runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:3.0.2'
testImplementation 'com.h2database:h2:2.2.224'
testImplementation 'org.spockframework:spock-core:2.3-groovy-3.0'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
api
: 编译时和运行时都需要的依赖。runtimeOnly
: 仅在运行时需要的依赖。testImplementation
: 测试时需要的依赖。testRuntimeOnly
: 仅在测试运行时需要的依赖。
Java工具链配置
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
vendor = JvmVendorSpec.BELLSOFT
}
}
- 设置Java工具链,指定使用BellSoft的JDK 17。
编译任务配置
tasks.withType(AbstractCompile).configureEach {
options.compilerArgs <<
"-Werror" <<
"-Xlint:all"
}
- 为所有编译任务配置编译器参数,使所有警告被视为错误,并启用所有Lint警告。
测试任务配置
tasks.withType(Test).configureEach {
maxParallelForks = 1 // there is currently only a single test class
useJUnitPlatform()
String testJavaRuntimeVersion = findProperty('testJavaRuntimeVersion') ?: '17'
String testGradleVersion = findProperty('testGradleVersion') ?: GradleVersion.current().version
javaLauncher.set(javaToolchains.launcherFor { spec ->
spec.languageVersion.set(JavaLanguageVersion.of(testJavaRuntimeVersion))
buildScan.value(identityPath.path + "#jvmVersion", testJavaRuntimeVersion)
} as Provider<? extends JavaLauncher>)
systemProperty 'testContext.gradleVersion', testGradleVersion
buildScan.value(identityPath.path + "#gradleVersion", testGradleVersion)
def incompatibleJavaVsGradleVersions = parseInt(testJavaRuntimeVersion) > 16 && GradleVersion.version(testGradleVersion) < GradleVersion.version('7.3') ||
parseInt(testJavaRuntimeVersion) > 15 && GradleVersion.version(testGradleVersion) < GradleVersion.version('7.0')
if (incompatibleJavaVsGradleVersions) {
enabled = false
}
}
- 配置测试任务:
maxParallelForks = 1
: 限制并行测试任务的数量为1。useJUnitPlatform()
: 使用JUnit Platform进行测试。- 动态设置测试使用的Java版本和Gradle版本,并根据兼容性检查是否启用测试任务。
具体解释
-
tasks.withType(Test).configureEach { ... }
:- 这一行代码的作用是找到所有类型为
Test
的任务,并对每一个任务应用下面的配置。
- 这一行代码的作用是找到所有类型为
-
maxParallelForks = 1
:- 设置并行测试任务的数量为1。这意味着测试任务将会串行执行。注释表明当前只有一个测试类,因此只需要一个并行分叉。
-
useJUnitPlatform()
:- 使用JUnit平台来运行测试。这对于支持JUnit 5及其新特性是必要的。
-
String testJavaRuntimeVersion = findProperty('testJavaRuntimeVersion') ?: '21'
:- 获取属性
testJavaRuntimeVersion
的值,如果没有设置则使用默认值'21'
。
- 获取属性
-
String testGradleVersion = findProperty('testGradleVersion') ?: GradleVersion.current().version
:- 获取属性
testGradleVersion
的值,如果没有设置则使用当前Gradle版本。
- 获取属性
-
javaLauncher.set(javaToolchains.launcherFor { spec -> ... } as Provider<? extends JavaLauncher>)
:- 使用指定的Java版本配置Java启动器:
spec.languageVersion.set(JavaLanguageVersion.of(testJavaRuntimeVersion))
:设置Java语言版本。buildScan.value(identityPath.path + "#jvmVersion", testJavaRuntimeVersion)
:将Java版本添加到构建扫描中。
- 使用指定的Java版本配置Java启动器:
-
systemProperty 'testContext.gradleVersion', testGradleVersion
:- 设置系统属性
testContext.gradleVersion
,其值为指定的Gradle版本。
- 设置系统属性
-
buildScan.value(identityPath.path + "#gradleVersion", testGradleVersion)
:- 将Gradle版本添加到构建扫描中。
-
版本兼容性检查:
- 通过以下条件检查Java版本和Gradle版本的兼容性:
def incompatibleJavaVsGradleVersions = parseInt(testJavaRuntimeVersion) > 16 && GradleVersion.version(testGradleVersion) < GradleVersion.version('7.3') ||
parseInt(testJavaRuntimeVersion) > 15 && GradleVersion.version(testGradleVersion) < GradleVersion.version('7.0') - 如果Java版本大于16且Gradle版本小于7.3,或者Java版本大于15且Gradle版本小于7.0,则认为不兼容。
- 通过以下条件检查Java版本和Gradle版本的兼容性:
-
禁用不兼容的测试任务:
- 如果检测到不兼容的Java和Gradle版本,则禁用测试任务:
if (incompatibleJavaVsGradleVersions) {
enabled = false
}
- 如果检测到不兼容的Java和Gradle版本,则禁用测试任务:
语法解释
javaLauncher.set(javaToolchains.launcherFor { spec ->
spec.languageVersion.set(JavaLanguageVersion.of(testJavaRuntimeVersion))
buildScan.value(identityPath.path + "#jvmVersion", testJavaRuntimeVersion)
} as Provider<? extends JavaLauncher>)
-
javaLauncher.set(...)
:javaLauncher
是测试任务的一个属性,用 于指定测试任务使用的Java启动器。set
方法将启动器设置为括号中的值。
-
javaToolchains.launcherFor { spec -> ... }
:javaToolchains
是Gradle的一个对象,用于管理Java工具链。launcherFor
方法接受一个闭包(在Groovy中,闭包类似于匿名函数),用于配置启动器规范spec
,并返回一个JavaLauncher
的Provider
(一个可以延迟求值的容器)。
-
闭包
spec -> ...
:- 闭包内部是对
spec
(启动器规范)的配置:spec.languageVersion.set(JavaLanguageVersion.of(testJavaRuntimeVersion))
spec.languageVersion.set(JavaLanguageVersion.of(testJavaRuntimeVersion))
:设置启动器使用的Java语言版本。testJavaRuntimeVersion
是一个变量,表示所需的Java版本。这里将其转换为JavaLanguageVersion
对象。
- 闭包内部是对
-
buildScan.value(identityPath.path + "#jvmVersion", testJavaRuntimeVersion)
:- 这一行将Java版本信息添加到构建扫描中。
buildScan
是一个用于记录构建信息的对象,value
方法用于添加键值对。 identityPath.path + "#jvmVersion"
生成一个唯一的键,将其与testJavaRuntimeVersion
关联。
- 这一行将Java版本信息添加到构建扫描中。
-
as Provider<? extends JavaLauncher>
:- 这部分是类型转换。
launcherFor
方法返回的是一个Provider
,它是一个可以延迟求值的对象。as Provider<? extends JavaLauncher>
将其明确转换为Provider
类型。
- 这部分是类型转换。
Javadoc任务配置
tasks.withType(Javadoc).configureEach {
options.addStringOption('Xdoclint:none', '-quiet')
}
- 为Javadoc任务配置参数,禁用所有文档检查并使其静默运行。
Gradle插件发布配置
gradlePlugin {
website = 'https://github.com/etiennestuder/gradle-jooq-plugin'
vcsUrl = 'https://github.com/etiennestuder/gradle-jooq-plugin'
plugins {
pluginDevPlugin {
id = 'nu.studer.jooq'
displayName = 'gradle-jooq-plugin'
description = 'Gradle plugin that integrates jOOQ.'
tags.set(['jooq'])
implementationClass = 'nu.studer.gradle.jooq.JooqPlugin'
}
}
}
- 配置插件发布信息:
website
: 插件的官网地址。vcsUrl
: 插件的版本控制系统地址。plugins
: 定义插件的具体信息,包括ID、名称、描述、标签和实现类。
插件验证任务配置
tasks.withType(ValidatePlugins.class).configureEach {
failOnWarning = true
enableStricterValidation = true
}
- 为插件验证任务配置严格的验证规则,确保任何警告都会导致构建失败。
这段代码详细配置了Gradle插件项目的各个方面,包括依赖管理、任务配置和插件发布,确保项目构建和测试过程中的一致性和可靠性。