构建与发布
把 Blink 插件构建成可投放 Jar:构建命令、产物路径、打包内容与 blinkGenerate 任务依赖链。
本篇讲如何在本地把 Blink 插件构建成可投放的 Jar:构建命令、产物路径与文件名、打包进 jar 的内容,以及 blinkGenerate 任务的依赖顺序。
读完本篇你能:
- 用
gradlew build/shadowJar产出插件 Jar,知道产物路径与文件名的来历。 - 看懂
blinkGenerate任务及其与各 Jar 任务的依赖顺序。 - 明白 fat jar 里打进了什么、没打进什么(Kotlin stdlib 排除、Blink relocate、Aria/Asteroid 运行时共享)。
构建你的插件
1.1 把 shadowJar 挂进 build
Blink Gradle 插件在 afterEvaluate 阶段自动应用 com.github.johnrengelman.shadow 插件(见 BlinkPlugin.kt 的 apply),但不会把 shadowJar 接到 build 上。在构建脚本末尾补一行:
这样 ./gradlew build 会一并产出 fat jar,否则需显式跑 ./gradlew shadowJar。
1.2 两种构建命令
Windows 下用 gradlew.bat,参数相同。
1.3 产物路径与文件名
Shadow 插件默认把产物写到 build/libs/,文件名形如:
<archiveBaseName>默认取项目名(settings.gradle.kts里rootProject.name或子模块名)。<version>取 Gradle 工程的version。-all是 Shadow 给shadowJar任务的默认archiveClassifier。
Blink 插件未改写 archiveClassifier,沿用 Shadow 默认值 all。普通 jar 任务产出 <name>-<version>.jar(无 classifier,不含依赖),shadowJar 产出带 -all 的 fat jar(含已合并依赖)。部署到服务器的是 -all.jar。若不想要 -all 后缀,可在脚本里覆盖:
1.4 fat jar 里有什么、没有什么
Blink Gradle 插件在 BlinkPlugin.kt 里做了三件影响打包内容的事:
-
排除 Kotlin stdlib。
configurations.runtimeClasspath上exclude掉org.jetbrains.kotlin和org.jetbrains:annotations:Kotlin 运行时由 Blink 的
KotlinBootstrap在运行期动态加载,不进 Jar,减小体积并避免多插件 stdlib 冲突。 -
relocate Blink 自身。
configureShadow把priv.seventeen.artist.blink重定位到<你的包名>.blink:pkgName取blink { packageName },为空时回退到project.group。多个 Blink 插件共存时不会因同名类冲突。 -
Aria / Asteroid 不打包。两者在运行时由各自的 SharedHost(
AriaSharedHost/AsteroidSharedHost)部署为全 JVM 共享的单份实例,既不打包也不 relocate。依赖中应是compileOnly(启用enableAria/enableAsteroid时插件自动以compileOnly注入,见configureAria/configureAsteroid)。
1.5 blinkGenerate 与 Jar 任务的依赖关系
blinkGenerate 是 Blink 的核心代码生成任务,在 configureCodeGeneration 中注册(见 BlinkPlugin.kt):
要点:
-
blinkGenerate依赖compileKotlin(无 Kotlin 时退化为compileJava),读取build/classes/kotlin/main下的已编译字节码做注解扫描。 -
所有
Jar类型任务都dependsOn(blinkGenerate),shadowJar作为Jar子类型同样纳入。执行顺序: -
每个 Jar 任务设
duplicatesStrategy = EXCLUDE,避免生成类与原始类重复报错。
BlinkGenerateTask 的产出(见 BlinkGenerateTask.kt 的 generate()):
- 扫描
@Awake/@AutoListener注解,用 ASM 生成三个入口类并写回 classes 目录:BlinkGeneratedLifeCycle.classBlinkGeneratedEvents.classBlinkGeneratedMain.class(plugin.yml里的main)
- 生成
plugin.yml(同时写到resources/main和 classes 目录),字段来自blink { }DSL:name/version/api-version/description/authors/depend/softdepend/folia-supported/blink-libraries/blink-log-prefix。 - 写一份
blink-scan-result.txt到build/供排查。
入口类是字节码生成、写回 classes 目录的,因此任何 Jar 打包都必须排在 blinkGenerate 之后——这是上面 dependsOn 的目的。Jar 里缺少 BlinkGeneratedMain,多半是绕过了 blinkGenerate。
1.6 启用混淆时的额外一环
当 blink { obfuscate = true } 且已应用 Proteus 插件时,configureProteus 让 obfuscate 任务 dependsOn("shadowJar"),并把 shadowJar 的输出作为 inputFile。完整链路:
混淆细节见 Proteus 混淆。
小结
- 你的插件:
./gradlew build(build挂shadowJar)→build/libs/<name>-<version>-all.jar,部署这个-all.jar。 - 打包链路:
compileKotlin → blinkGenerate → shadowJar(开混淆再→ obfuscate)。Kotlin stdlib 不打包、Blink 被 relocate、Aria/Asteroid 运行时共享。
下一步
- 开启
obfuscate后的完整配置:Proteus 混淆。 blink { }字段如何影响plugin.yml与构建:快速开始与 blink{} 配置。
