sonarqube 不支持自动识别未标注 @deprecated 的过期 api,需通过自定义 java 插件结合命名匹配、javadoc 分析、外部配置或版本规则实现检测,并在 ast 或符号表层面校验缺失注解。

SonarQube 本身不直接提供“自动识别未标注 @Deprecated 的过期 API”这一功能,因为是否“过期”属于业务语义判断,而非语法层面可推断的事实。要实现该能力,需通过自定义 Java 插件(基于 SonarJava)编写规则,在 AST 或符号表层面识别“本应被标记为 @Deprecated 却未标记”的方法/类,并结合你定义的过期判定逻辑(如命名约定、版本注释、外部配置等)触发告警。
明确“过期 API”的判定依据
SonarQube 规则无法凭空知道哪个 API 过期了——必须有可编程的判断标准。常见可行方式包括:
-
命名匹配:方法名含
old、legacy、v1、obsolete等关键词(适用于历史遗留命名规范) -
注释内容分析:Javadoc 中包含
@deprecated(小写,非注解)、will be removed、replaced by等提示性文本(注意区分真实废弃说明与普通描述) -
外部元数据驱动:读取项目内 YAML/JSON 配置文件(如
deprecated-apis.yml),声明哪些package.Class#method()应被标记 - 版本生命周期管理:结合 Git 标签或 Maven 版本号,将已发布 N 个大版本前的 public API 视为待弃用(需配套版本追踪逻辑)
在自定义规则中访问关键信息
基于 SonarJava 7.0+(推荐使用最新 LTS),在 JavaCheck 实现中可获取:
-
Symbol:调用
symbol.owner().metadata().deprecation()可检查是否已有@Deprecated注解;若返回null,说明未标注 -
Tree:对
MethodTree或ClassTree,用firstToken().parent().getComments()提取 Javadoc 并正则匹配废弃提示 -
CompilationUnitTree:在
scanFile阶段加载外部配置(如deprecated-apis.yml),构建Set<string></string>做快速命中判断 -
SymbolTable:遍历所有 public 方法,排除
java.*和测试类,聚焦于当前模块的 API 表面层
编写核心检测逻辑示例
以“Javadoc 含废弃提示但无 @Deprecated 注解”为例,规则片段如下:
public class MissingDeprecatedAnnotationCheck implements JavaCheck {
@Override
public void scanFile(JavaCheckContext context) {
Trees trees = context.getTrees();
CompilationUnitTree cut = context.getTree();
cut.types().forEach(type -> scanType(type, trees, context));
}
private void scanType(Tree type, Trees trees, JavaCheckContext context) {
if (type.is(Tree.Kind.CLASS)) {
ClassTree classTree = (ClassTree) type;
classTree.members().forEach(member -> {
if (member.is(Tree.Kind.METHOD)) {
MethodTree method = (MethodTree) member;
Symbol symbol = trees.getSymbol(method);
if (symbol != null && symbol.isPublic() && !symbol.isDeprecated()) {
String javadoc = getJavadocText(method);
if (javadoc != null && containsDeprecationHint(javadoc)) {
context.reportIssue(this, method.simpleName(), "此方法在 Javadoc 中声明将被弃用,但缺少 @Deprecated 注解");
}
}
}
});
}
}
private boolean containsDeprecationHint(String javadoc) {
return javadoc.toLowerCase().contains("deprecated") ||
javadoc.toLowerCase().contains("will be removed") ||
javadoc.toLowerCase().contains("replaced by");
}
}
部署与生效注意事项
自定义插件需满足:
- 打包为
jar,包含META-INF/MANIFEST.MF声明Plugin-Class和兼容的 SonarQube 版本 - 插件中
sonar-plugin-api和sonar-java-api依赖版本必须与目标 SonarQube 的 SonarJava 插件主版本一致(如 SQ 9.9 对应 SonarJava 7.25) - 规则需在
RulesDefinition中注册,并启用后才能在 Quality Profile 中分配 - 若依赖外部配置文件,需确保其位于扫描根目录下,且插件有权限读取(不支持 classpath 资源,仅支持工作目录相对路径)
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











