使用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一样。但也许不是?
你可以用更多的细节/代码来更新你的问题:关于你的规则是如何被注册和激活的(https://docs.sonarqube.org/display/PLUG/Writing+Custom+Java+Rules+101#WritingCustomJavaRules101-将客户注册到自己的插件)? –