Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SonarQube不';无法识别自定义检查规则_Java_Sonarqube - Fatal编程技术网

Java SonarQube不';无法识别自定义检查规则

Java 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.

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

我可以看到class
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。