[英]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 ,注意专用getXmlChecks
和getMavenChecks
。 这些是实际针对Scanner索引的XML文件运行的检查。
具体来说
虽然您可以自由地为getJavaChecks
或getJavaTestChecks
添加自定义规则,但SonarJava API不支持向getMavenChecks
添加规则(您可以尝试但它实际上什么都不做)。 您的整体分析非常明确,但事实是只有包含api的软件包才能通过类加载器( 示例 )访问,而不是PomCheck的情况。
我不知道在这方面有任何改变的计划。
“开箱即用思考”的建议
SonarXML使用XPath表达式支持自定义规则(请参阅扩展指南 )。 有了一点XPath体操,你可以考虑扩展规则xml:XPathCheck - 跟踪违反XPath规则的行为 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.