关于 jspecify-skill
帮助 Java 项目添加 JSpecify 空值注解并逐步采用的技能,面向 Maven 和 Gradle 用户,涵盖包标记、旧注解迁移及可选的 Kotlin 互操作。
主要功能
- 01Maven 与 Gradle 配置指导
- 02通过 @NullMarked 标记包
- 03使用 @NullUnmarked 渐进采用
- 04迁移其他空值注解
- 05可选的 Kotlin 互操作指导
适用场景
- 01在 Java 项目中启用空值检查
- 02逐包推广空值标记
- 03将现有注解迁移到 JSpecify
- 04改善 Kotlin 使用 Java API 时的空值识别
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ sivaprasadreddy/ sivalabs-agent-skills --skill jspecify-skill安装后在 Claude Code 中输入/jspecify-skill确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/annotation-migration.mdincremental-adoption.mdkotlin-interop.mdscripts/verify_nullmarked.py详细介绍
Jspecify 提供了一组注解,用于明确声明 Java 代码对 null 值的预期。
在 Maven 项目中添加 jSpecify 支持
如果你使用 Maven,请在 pom.xml 中添加 jspecify 依赖。
在 pom.xml 中更新或添加 nullability-maven-plugin,并加入以下配置。
<dependencies>
<dependency>
<groupId>org.jspecify</groupId>
<artifactId>jspecify</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>am.ik.maven</groupId>
<artifactId>nullability-maven-plugin</artifactId>
<version>0.4.2</version>
<extensions>true</extensions>
<configuration>
<checking>tests</checking>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
<testOutputDirectory>${project.basedir}/src/test/java</testOutputDirectory>
</configuration>
<executions>
<execution>
<goals>
<goal>configure</goal>
<goal>generate-package-info</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
在 Gradle 项目中添加 jSpecify 支持
如果你使用 Gradle,请添加 jspecify 依赖。
在 build.gradle 或 build.gradle.kts 中更新或添加以下 jspecify 配置。
plugins {
id("net.ltgt.errorprone") version "5.1.0"
id("net.ltgt.nullaway") version "3.1.0"
}
tasks.withType(JavaCompile).configureEach {
options.errorprone {
disableAllChecks = true // Other error prone checks are disabled
error("RequireExplicitNullMarking") // Require @NullMarked or @NullUnmarked on everything
nullaway {
error()
}
}
// Keep a JDK 25 baseline
options.release = 25
}
nullaway {
onlyNullMarked = true
jspecifyMode = true
}
dependencies {
implementation("org.jspecify:jspecify:1.0.0")
errorprone("com.google.errorprone:error_prone_core:2.50.0")
errorprone("com.uber.nullaway:nullaway:0.13.7")
}
在 package-info.java 文件中添加 @NullMarked
在应用主源代码(src/main/java)下的每个 Java 包中,如果尚不存在 package-info.java,请创建该文件,并按如下方式添加 @NullMarked 注解:
@org.jspecify.annotations.NullMarked
package com.mycompnay.myproject;
如果 package-info.java 文件已存在,请更新该文件,添加 @org.jspecify.annotations.NullMarked 注解。
请勿删除 package-info.java 文件中的任何其他现有代码。
验证 jSpecify 支持
如果已安装 Python,添加 jSpecify 支持后,请运行 scripts/verify_nullmarked.py,检查所有非空包是否都有 package-info.java 文件。
从其他注解库迁移现有代码库
如果项目已使用其他 nullability 注解库(JSR-305 / javax、Jakarta、
JetBrains、Spring、Android、FindBugs/SpotBugs、Checker Framework 或 Eclipse JDT),请先将这些注解迁移到 JSpecify,再添加 @NullMarked。OpenRewrite 的 MigrateToJSpecify 配方可自动处理常见情况(javax、Jakarta、JetBrains、Micrometer、Micronaut);其余情况只需进行少量手动映射。请参阅 references/annotation-migration.md。
大型代码库的渐进式采用
在大型或遗留代码库中,一次性将每个包都设为 @NullMarked 并不现实。借助 @NullUnmarked,你可以在逐步扩大的范围内启用 NullAway,同时保持其余部分不变。
由于上述构建配置启用了 OnlyNullMarked 模式,没有 @NullMarked 的包会被直接忽略,因此只需逐个包添加标记即可逐步采用。策略、进度跟踪、常见 NullAway 错误以及冗余 null 检查的移除方法,请参阅 references/incremental-adoption.md。
Kotlin 互操作(可选)
如果项目还包含 Kotlin 源代码,Kotlin 编译器(K2)会读取 Java API 上的 JSpecify 注解,并提供准确的 nullability 信息,而不是平台类型。请参阅 references/kotlin-interop.md。