您好我正在尝试为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存在严重问题,建议高度更新吗?
答案 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。