自定义声纳规则 - 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的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 自定义声明允许的数据类型是啥?

在可调用函数中使用自定义声明时是不是需要调用 verifyIdToken()? [复制]

验证是不是在 Assertj 中调用了断言

Firebase 存储身份验证

Firebase Auth - 自定义声明的用户列表

如何在 IdentityServer4 中添加自定义声明以访问令牌? [关闭]