gpt4 book ai didi

java - SonarQube 无法识别自定义 PomCheck 规则

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:49:37 27 4
gpt4 key购买 nike

使用 Java 插件 4.9.0.9858 运行 SonarQube 6.4。我编写了一条规则来确认内部开发的 Maven 项目正在导入包含各种库的标准版本号的父 POM 文件。我已成功编码、单元测试、部署和激活质量配置文件中的规则。但是,当我使用该质量配置文件对 Maven 项目运行扫描时,不会触发该规则。

我可以看到类 org.sonar.java.xml.XmlAnalyzer 决定了通常为 xml 文件和特别是 pom 文件触发哪些规则。具体来说,XMLAnalyzer 选择作为 org.sonar.java.xml.maven.PomChecks 实例的所有规则以应用于 pom.xml 文件。

问题是,我的自定义规则org.sonar.java.xml.maven.PomCheck的实例,如下

import org.sonar.java.xml.maven.PomCheck;

...snip...

@Rule( key = "UseParentPOM" )

public class UseParentPOM implements PomCheck {

...snip...

这种“实现 PomCheck”方法正是 java 插件提供的规则(如 GroupIdNamingConventionCheck)将自己定义为 PomChecks 的方式——并且它们正在在我的扫描运行期间被选中。我已经检查过我正在使用与 SQ 安装所使用的插件库版本相同的插件库版本来编译我的自定义规则。运行 sonar-scanner-debug 并附加到正在运行的进程显示我的 UseParentPOM 规则实际上在 XMLAnalyzer 用于搜索候选规则的访问者列表中。但是“visitor instanceof PomCheck”的具体情况返回false。因此,我的规则没有添加到 pom 规则列表中,也没有在扫描 pom.xml 时触发。

显然我的规则类不是 XMLAnalyzer 期望的 PomCheck,但是我做错了什么让它成为 PomCheck 的实例?

更新

一些进一步的挖掘表明,提供类 java-frontend-4.9.0.9858.jar 的 .jar 文件在基础 sonar-java-plugin-4.9.0.9858.jar 和我的自定义 java-rules- 中1.0-SNAPSHOT.jar。我的调试运行显示 SonarQube 似乎为扩展目录中找到的每个插件 .jar 启动了单独的类加载器。因此,就 SQ 而言,确实有 2 个“org.sonar.java.xml.maven.PomCheck”类。因此,我原来的问题。

因此,我试图通过将所有 Sonar 相关依赖项的范围限定为 ,从我的自定义规则 .jar 中删除 java-frontend-4.9.0.9858.jar(以及 PomCheck 类)。我希望生成的 SQ 进程将有 1 个 PomCheck 类来统治它们。然而,实际结果是 SQ 甚至没有启动,由于无法找到 (TA DA) 类 PomCheck,Web 服务器进程在尝试加载我的自定义规则类时失败。

因此,我似乎陷入了一个无法解决的困境——如果我在我的自定义 .jar 中包含 PomCheck,SQ 可以正常启动,但不会将我的自定义规则识别为“真正的”PomCheck。如果我不在我的自定义 .jar 中包含 PomCheck,SQ 根本不会启动。所以现在我真的进退两难了 - 请帮忙。

其他详细信息

Re: Nicholas B的请求,注册我的自定义规则的代码如下

public final class MyRulesList {

...snip...

public static List<Class<? extends JavaCheck>> getChecks() {
return ImmutableList.<Class<? extends JavaCheck>>builder().addAll(getJavaChecks()).addAll(getJavaTestChecks()).build();
}
public static List<Class<? extends JavaCheck>> getJavaChecks() {
return ImmutableList.<Class<? extends JavaCheck>>builder()
.add(PackageNaming.class)
.add(LoggingLevels.class)
.add(UseParentPOM.class)
.build();
}
... snip ...

这段代码是直接从 Writing Custom Java Rules 101 站点复制的。据我所知,所有 3 个自定义类都已正确注册 - 我可以在 Web 控制台 UI 中看到它们并将它们添加到那里的 Quality Gate。规则 PackageNaming/LoggingLevels 和规则 UseParentPOM 之间的唯一区别是 UseParentPOM 实现 PomCheck 接口(interface),而不是 JavaCheck。然而,由于类 PomCheck 只不过是类 JavaCheck 的包装器,这似乎是注册 UseParentPom 类的正确方法,例如就像任何其他 JavaCheck 一样。但也许不是?

最佳答案

简而言之:SonarJava 不支持 POM 文件的自定义检查(即自定义 PomCheck)。

更多详情

根据 Java custom rules tutorial ,必须通过将自定义规则提供给 getJavaChecks(针对源文件进行检查)或 getJavaTestChecks(针对测试文件进行检查)来​​激活自定义规则。问题是 pom.xml 文件不属于这两个类别中的任何一个,它们属于检查特定规则的“XML 文件桶”。

形象化的一个好方法是看一眼 SonarJava 的 CheckList.java ,请注意专用的 getXmlChecksgetMavenChecks。这些是实际针对扫描程序索引的 XML 文件运行的检查。

具体来说

虽然您可以自由地向 getJavaChecksgetJavaTestChecks 添加自定义规则,但 SonarJava API 不支持向 getMavenChecks 添加规则(您可以尝试但它实际上什么都不做)。您的整体分析非常准确,但事实是只有包含 api 的包才能通过类加载器 (example) 访问,而不是 PomCheck

我不知道这方面有任何更改计划。

“跳出框框思考”的建议

SonarXML支持使用 XPath 表达式的自定义规则(参见 extension guide )。通过一些 XPath 体操,您可以考虑扩展规则 xml:XPathCheck - 跟踪违反 XPath 规则的情况

关于java - SonarQube 无法识别自定义 PomCheck 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45884177/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com