自定义声纳规则 - ClassNotFoundException: com.sonar.sslr.api.AstAndTokenVisitor
Posted
技术标签:
【中文标题】自定义声纳规则 - ClassNotFoundException: com.sonar.sslr.api.AstAndTokenVisitor【英文标题】:Custom sonar rule - ClassNotFoundException: com.sonar.sslr.api.AstAndTokenVisitor 【发布时间】:2014-08-15 22:33:05 【问题描述】:部署自定义规则(如https://github.com/SonarSource/sonar-java/blob/master/java-checks/src/main/java/org/sonar/java/checks/UselessImportCheck.java)后,当我启动 SonarQube 4.2 时,在声纳启动期间抛出以下异常:
Caused by: java.lang.ClassNotFoundException: com.sonar.sslr.api.AstAndTokenVisitor
at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50) ~[plexus-classworlds-2.2.3.jar:na]
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244) ~[plexus-classworlds-2.2.3.jar:na]
at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230) ~[plexus-classworlds-2.2.3.jar:na]
... 44 common frames omitted
上面提到的类应该在 sslr-core-1.19.2.jar 中找到,我在位置 sonarqube-4.2/web/deploy/plugins/squidjava/META-INF/lib/sslr-core- 1.19.2.jar
我是否遗漏了一些步骤来增强默认声纳库? 目前安装的插件有(sonarqube-4.2/extensions/plugins):
sonarqube-4.2/extensions/plugins/sonar-checkstyle-plugin-2.1.jar sonarqube-4.2/extensions/plugins/sonar-web-plugin-2.1.jar sonarqube-4.2/extensions/plugins/sonar-jacoco-plugin-2.2.1.jar sonarqube-4.2/extensions/plugins/sonar-java-plugin-2.2.1.jar sonarqube-4.2/extensions/plugins/sonar-surefire-plugin-2.2.1.jar sonarqube-4.2/extensions/plugins/sonar-pmd-plugin-2.2.jar sonarqube-4.2/extensions/plugins/sonar-findbugs-plugin-2.2.1.jar sonarqube-4.2/extensions/plugins/sonar-squid-java-plugin-2.2.1.jar我应该怎么做才能防止上面提到的异常(除了取消部署提到的自定义插件)?
是否应该将必要的库直接捆绑到自定义插件中?我希望声纳能够捆绑此类库。
【问题讨论】:
【参考方案1】:最后我找到了问题的解决方案/解释:
sonarqube-4.2/web/deploy/plugins/ 目录在声纳启动期间从 sonarqube-4.2/extensions/plugins 目录。每个插件的 META-INF jar 中都应该有 lib 目录。这样的 lib 目录应该包含所有必要的库。
就我而言:
META-INF/lib/asm-5.0.1.jar
META-INF/lib/java-checks-2.2.1.jar
META-INF/lib/java-squid-2.2.1.jar
META-INF/lib/jaxen-1.1.4.jar
META-INF/lib/sslr-core-1.19.2.jar
META-INF/lib/sslr-squid-bridge-2.3.jar
META-INF/lib/sslr-xpath-1.19.2.jar
并且 META-INF/MANIFEST.MF 必须除了其他重要的定义包含到这些库的链接:
Plugin-Dependencies: META-INF/lib/java-checks-2.2.1.jar META-INF/lib/j
axen-1.1.4.jar META-INF/lib/sslr-squid-bridge-2.3.jar META-INF/lib/ss
lr-xpath-1.19.2.jar META-INF/lib/asm-5.0.1.jar META-INF/lib/sslr-core
-1.19.2.jar META-INF/lib/java-squid-2.2.1.jar
这些步骤部署成功后,插件就可以使用了。
上面提到的事实对于 MAVEN 用户来说可能很清楚(有很多 pom 文件),但是 gradle 用户必须自己创建这样的构建,这些信息可能对他们有用。
祝你好运!
【讨论】:
代码示例查找github.com/misak69/misak69-sonar-custom/blob/master/…以上是关于自定义声纳规则 - ClassNotFoundException: com.sonar.sslr.api.AstAndTokenVisitor的主要内容,如果未能解决你的问题,请参考以下文章