繁体   English   中英

SonarQube无法识别自定义PomCheck规则

[英]SonarQube doesn't recognize custom PomCheck rule

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

我可以看到类org.sonar.java.xml.XmlAnalyzer决定为一般的xml文件和特别是pom文件触发哪些规则。 具体来说,XMLAnalyzer选择所有作为org.sonar.java.xml.maven.PomChecks实例的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用于搜索候选规则的访问者列表。 但是“访问者实例PomCheck”的具体情况返回false。 因此,我的规则未添加到pom规则列表中,并且在扫描pom.xml时不会触发。

很明显,我的规则类不是XMLAnalyzer所期望的PomCheck,但是我把它作为PomCheck的实例做错了什么?

UPDATE

进一步挖掘显示提供类java-frontend-4.9.0.9858.jar的.jar文件位于基本声纳-java-plugin-4.9.0.9858.jar和我的custom-java-rules-1.0-SNAPSHOT 。罐。 我的调试运行显示,SonarQube似乎为扩展目录中的每个插件.jar启动了单独的类加载器。 因此,就SQ而言,确实有2'org.sonar.java.xml.maven.PomCheck'类。 因此我原来的问题。

我因此尝试从我的自定义规则.jar中删除java-frontend-4.9.0.9858.jar(以及PomCheck类),将所有与声纳相关的依赖关系作为<provided>进行定义。 我希望得到的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 ...

}

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

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

更多细节

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

想象这样的一个好方法是在SonarJava的目光CheckList.java ,注意专用getXmlChecksgetMavenChecks 这些是实际针对Scanner索引的XML文件运行的检查。

具体来说

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

我不知道在这方面有任何改变的计划。

“开箱即用思考”的建议

SonarXML使用XPath表达式支持自定义规则(请参阅扩展指南 )。 有了一点XPath体操,你可以考虑扩展规则xml:XPathCheck - 跟踪违反XPath规则的行为

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM