我按照有问题的说明进行操作 Ignore Issues in Blocks 但由于它不起作用,我怀疑它可能与正则表达式相关而不是声纳配置。
我有一些由EMF生成的代码。我更改了代码生成模板,以便在块的末尾添加// end-generated标记,如下所示:
/*
* @generated
*/
public class MyGeneratedClass implements Enumerator {
/*
* @generated
*/
public void myGeneratedMethod() {
// some code that SonarQube doesn't like
} //end-generated
}
这个想法是正则表达式必须只匹配方法块。因此START-BLOCK必须匹配文字 @generated ,只要在评论终止后没有跟上'class','enum'或'interface'字样。
我创建了这个正则表达式:
对于开始区块:
@generated\h*\s[\s\*]*\/(?!\s*[^\s]*\s*(class|enum|interface)\s)
对于结束块:
\/\/end-generated
这在我的测试中使用了一个带有Java Pattern类的简单代码,对于上面的类示例返回true:
public static void main(String[] args) throws IOException {
String regex = "@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s)";
String text = new String(Files.readAllBytes(Paths.get("test.txt")));
Matcher matcher = Pattern.compile(regex).matcher(text);
System.out.println(matcher.find());
}
但是,当我将其添加到SonarQube配置时,它不起作用,SonarQube仍会报告生成的方法中发现的问题。
我添加了正则表达式:
SonarQube»设置»排除»问题»忽略块中的问题
我也尝试使用转义版的正则表达式,结果是一样的:
@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s)
同样将这些设置直接添加到Sonar属性中也不起作用,正如我在上面提到的问题中已经报道的那样:
sonar.issue.ignore.block=rule1
sonar.issue.ignore.block.rule1.beginBlockRegexp=@generated\\h*\\s[\\s\\*]*\\/(?!\\s*[^\\s]*\\s*(class|enum|interface)\\s)
sonar.issue.ignore.block.rule1.endBlockRegexp=\\/\\/end-generated
我正在使用SonarQube服务器5.1.2并运行Sonar-ant-task 2.3的分析。
我想知道使SonarQube无法匹配的正则表达式是否有问题,或者SonarQube正则表达式处理可能存在一些限制?
编辑:我更改了正则表达式,以便更简单地匹配'@generated'一词,并且它有效。但是如果我把'@generated [\ n \ r]'强制仅仅匹配@generated之后有一个新行,那么它就不再起作用了。
似乎SonarQube不支持新行字符等基本内容。有人可以证实这一点吗?
答案 0 :(得分:1)
我确认用于排除问题的所有模式都是每行应用的。最后,它始终被翻译为"排除从第X行到第Y行和第34行的问题。我同意这不完美(特别是现在我们有精确的发行地点),但这是一个历史性的"特征。我们可能不会投入时间,因为我们的心情是避免复杂的配置。您的用例的理想解决方案是实施https://jira.sonarsource.com/browse/SONARJAVA-71。
答案 1 :(得分:0)
由于SonarQube每行应用正则表达式,我为这个用例提出了不同的解决方案:
我使用每行的起始块正则表达式:(?m)@ generated $然后通过将此模式添加到end-block正则表达式以及结束生成来排除class | enum | interface。
最终配置如下所示:
sonar.issue.ignore.block=rule1
sonar.issue.ignore.block.rule1.beginBlockRegexp=(?m)@generated$
sonar.issue.ignore.block.rule1.endBlockRegexp=\/\/\h*end-generated|\sclass\s|\senum\s|\sinterface\s