2017-08-25 133 views
3

使用Java插件4.9.0.9858运行SonarQube 6.4我写了一条规则来确认内部开发的maven项目正在导入包含各种库的标准版本号的父POM文件。我编码,单元测试,部署并成功激活了质量配置文件中的规则。但是,当我使用该质量配置文件对Maven项目运行扫描时,该规则未被解雇。SonarQube无法识别自定义PomCheck规则

我可以看到类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用于搜索候选规则的访问者列表中。但“PomCheck访客实例”的具体情况返回false。 Ergo,我的规则不会添加到pom规则列表中,并且在扫描pom.xml时不会被触发。

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

UPDATE

一些进一步挖掘表明.jar文件提供类,java的前端-4.9.0.9858.jar,在两个基声纳-java的插件-4.9.0.9858.jar和我的custom-java-rules-1.0-SNAPSHOT.jar。我的调试运行表明SonarQube似乎为扩展目录中的每个插件.jar启动了单独的类加载器。因此,就SQ而言,的确有2个'org.sonar.java.xml.maven.PomCheck'类。因此我的原始问题。

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

我似乎已经达到了一个不可解决的困境 - 如果我在自定义.jar中包含PomCheck,SQ开始很好,但不会将我的自定义规则识别为“真实”PomCheck。如果我在自定义.jar中不包含PomCheck,则SQ将不会启动。所以现在我真的陷入了困境 - 请帮助。

额外的细节

回复:尼古拉斯·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中看到它们,并将它们添加到质量门。规则PackageNaming/LoggingLevels和规则UseParentPOM之间的唯一区别是UseParentPOM实现了PomCheck接口,而不是JavaCheck。然而,由于PomCheck类不过是类JavaCheck的封装,所以这似乎是注册UseParentPom类的正确方法,例如,就像其他JavaCheck一样。但也许不是?

+0

你可以用更多的细节/代码来更新你的问题:关于你的规则是如何被注册和激活的(https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101#WritingCustomJavaRules101-将客户注册到自己的插件)? –

回答

1

简而言之: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规则

+0

公平的恩,我已经走下了XPathCheck路线寻找其他更简单的规则。不过,我会在这里请求SQ团队考虑在Java插件中添加对定制PomChecks的支持。在我看来,如果基本的java插件本身支持做PomCheck,那么也应该可以添加一个自定义的PomCheck。 – SCornell

相关问题