SonarQube Java插件 - 带4.1的自定义规则示例

时间:2014-04-23 14:11:07

标签: java sample sonarqube

您好我正在尝试为SonarQube 4.1找到一种实现自定义Java规则的方法。

website我发现example plugin on github和一个基于JavaFileScanner的ExampleCheck。

然而,我有几个严重的问题要让事情发挥作用。 现在我希望至少可以帮助我让样本在SonarQube 4.1中运行。

编译和部署不起作用,因为它依赖于sonar-plugin-api 4.1.1等启动SonarQube对此的抱怨

ERROR [o.s.s.p.PlatformLifecycleListener]  Fail to start server
java.lang.IllegalStateException: Plugin javacustomrules needs a more recent version of SonarQube than 4.1. At least 4.1.1 is expected

将依赖项更改为4.1版本并让sonarqube启动。我可以在QualityProfile中选择规则并运行:

mvn sonar:sonar

但是这会以下列错误结束:

...
Caused by: org.sonar.squid.api.AnalysisException: SonarQube is unable to analyze file : 'C:\projects\...MyClass.java'
        at org.sonar.java.ast.AstScanner.scan(AstScanner.java:102)
        at org.sonar.java.JavaSquid.scanSources(JavaSquid.java:135)
        at org.sonar.java.JavaSquid.scan(JavaSquid.java:129)
    Caused by: java.lang.ClassCastException: org.sonar.java.model.JavaTree$CompilationUnitTreeImpl cannot be cast to org.sonar.java.model.JavaTree$CompilationUnitTreeImpl
            at org.sonar.samples.java.PrinterVisitor.scan(PrinterVisitor.java:66)
            at org.sonar.samples.java.PrinterVisitor.print(PrinterVisitor.java:34)
            at org.sonar.samples.java.ExampleCheck.scanFile(ExampleCheck.java:49)
            at org.sonar.java.model.VisitorsBridge.visitFile(VisitorsBridge.java:87)
            at com.sonar.sslr.impl.ast.AstWalker.walkAndVisit(AstWalker.java:67)
            at org.sonar.java.ast.AstScanner.scan(AstScanner.java:95)
  ... 62 more

相应的代码对我来说没什么问题,因为有一个从JavaTree.CompilationUnitTreeImpl到JavaTree的转换。

在GitHub上没有TestCase的历史记录,所以我看不出可能有什么变化。或者SonarQube 4.1存在严重问题,建议高度更新吗?

1 个答案:

答案 0 :(得分:2)

我是写这个例子的人,事实上它在很多方面都很混乱。

对您的问题的简短回答是:版本4.1没有重大问题,获取最新版本的示例(几分钟前更正),您应该没问题:https://github.com/SonarSource/sonar-examples/tree/master/plugins/java-custom-rules

要了解发生了什么:

java插件中的AST是一个不完整的API。为了提供一个可视化AST的好方法,我在示例中提供了一个PrinterVisitor,用于显示与节点关联的行号(因此转换为JavaTree)但是我搞砸了依赖这会增加你遇到的麻烦(基本上,没有从正确的依赖中加载类),而且麻烦的是,为了获得这一行,我不得不将ASTNode抽象泄漏到这个例子中,这绝对不是旨在成为公共API的一部分。

因此,此处的快速更正是删除此行号的显示以使此示例正常工作。更长的修正将花费更多的时间来考虑满足此需求的最佳API设计。我们计划在某些时候让PrinterVisitor回归公共API。