Java SonarQube不';无法识别自定义检查规则
使用Java插件4.9.0.9858运行SonarQube 6.4。我已经编写了一条规则来确认内部开发的maven项目正在导入包含各种库的标准版本号的父POM文件。我已经成功地编码、单元测试、部署和激活了质量概要中的规则。但是,当我使用该质量配置文件对maven项目运行扫描时,不会触发该规则 我可以看到classJava SonarQube不';无法识别自定义检查规则,java,sonarqube,Java,Sonarqube,使用Java插件4.9.0.9858运行SonarQube 6.4。我已经编写了一条规则来确认内部开发的maven项目正在导入包含各种库的标准版本号的父POM文件。我已经成功地编码、单元测试、部署和激活了质量概要中的规则。但是,当我使用该质量配置文件对maven项目运行扫描时,不会触发该规则 我可以看到classorg.sonar.java.xml.XmlAnalyzer一般决定为xml文件触发哪些规则,特别是为pom文件触发哪些规则。具体地说,XMLAnalyzer选择作为org.sonar.
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...
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 ...
这种“implements 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似乎为extensions目录中的每个plugin.jar启动了单独的类加载器。因此,就SQ而言,确实存在2个“org.sonar.java.xml.maven.PomCheck”类。因此,我的原始问题
因此,我试图通过将所有与sonar相关的依赖项范围限定为,从custom rules.jar中删除java-frontend-4.9.0.9858.jar(以及PomCheck类)。我希望由此产生的SQ过程将有一个PomCheck类来管理它们。但是,实际结果是SQ甚至没有启动,web服务器进程在尝试加载自定义规则类时失败,因为无法找到(TA DA)类检查
因此,我似乎陷入了一个无法解决的两难境地——如果我在custom.jar中包含PomCheck,SQ一开始就很好,但不承认我的自定义规则是“真正的”PomCheck。如果我不在custom.jar中包含PomCheck,SQ将根本不会启动。所以现在我真的很困惑-请帮忙
其他详细信息
回复:Nicholas B的请求,注册我的自定义规则的代码如下
import org.sonar.java.xml.maven.PomCheck;
...snip...
@Rule( key = "UseParentPOM" )
public class UseParentPOM implements PomCheck {
...snip...
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 ...
公共最终类MyRulesList{
剪
公共静态列表简而言之:SonarJava不支持POM文件的自定义检查(即自定义PomCheck)
更多详细信息
根据,必须通过将自定义规则输入到getJavaChecks
(对照源文件进行检查)或getJavaTestChecks
(对照测试文件进行检查)来激活自定义规则。问题是pom.xml文件不属于这两个类别中的任何一个,而是属于“xml文件桶”,根据特定规则进行检查
可视化的一个好方法是浏览一下Java,注意专用的getXmlChecks
和getMavenChecks
。这些检查实际上是针对扫描程序索引的XML文件运行的
具体地说
虽然您可以自由地将自定义规则添加到getJavaChecks
或getJavaTestChecks
,但SonarJava API不支持将规则添加到getMavenChecks
(您可以尝试,但实际上什么也做不到)。您的总体分析非常到位,但事实是只有包含api的包可以通过classloader()访问,而不是PomCheck
我不知道在这方面有什么改变的计划
“跳出框框思考”建议
支持使用XPath表达式的自定义规则(请参阅)使用一点XPath体操,可以考虑扩展规则XML:XPath Chest-Tracle违反XPath规则。您可以用更多的细节/代码来更新您的问题吗?关于规则如何?Neffy Nuffi,我已经在XPATCHECK路由下使用了一些其他更简单的规则。不过,我会在这里请求SQ团队添加S。支持Java插件的自定义PomCheck。在我看来,如果基础Java插件本身支持执行PomCheck,那么也可以添加自定义PomCheck。