sonar版本:5.6java
checkstyle: 6.12.1bootstrap
sonar-checkstyle: 2.5-SNAPSHOTapi
checkstyle-all : 2.5-SNAPSHOTapp
sonar-checkstyle-plugin: 2.5-SNAPSHOT maven
代碼質量配置中添加checkstyle規則後,在執行代碼檢查時,報以下異常,致使檢查中斷:ide
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.io.Closeables.closeQuietly(Ljava/io/InputStream;) at com.puppycrawl.tools.checkstyle.PackageNamesLoader.getPackageNames(PackageNamesLoader.java:156) at com.puppycrawl.tools.checkstyle.Checker.finishLocalSetup(Checker.java:137) at com.puppycrawl.tools.checkstyle.api.AutomaticBean.configure(AutomaticBean.java:134) at org.sonar.plugins.checkstyle.CheckstyleExecutor.execute(CheckstyleExecutor.java:84) at org.sonar.plugins.checkstyle.CheckstyleSensor.analyse(CheckstyleSensor.java:57) at org.sonar.batch.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:58) at org.sonar.batch.phases.SensorsExecutor.execute(SensorsExecutor.java:50) at org.sonar.batch.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:83) at org.sonar.batch.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:189) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127) at org.sonar.batch.scan.ProjectScanContainer.scan(ProjectScanContainer.java:265) at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:260) at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:258) at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:250) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142) at org.sonar.batch.scan.ProjectScanContainer.startComponents(ProjectScanContainer.java:128) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127) at org.sonar.batch.task.ScanTask.execute(ScanTask.java:55) at org.sonar.batch.task.TaskContainer.doAfterStart(TaskContainer.java:86) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127) at org.sonar.batch.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:124) at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:119) at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:62) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60) at com.sun.proxy.$Proxy0.execute(Unknown Source) at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:240) at org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:151) at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:110) at org.sonarsource.scanner.cli.Main.execute(Main.java:72) at org.sonarsource.scanner.cli.Main.main(Main.java:60)
未徹底解決guava版本不兼容的問題。具體緣由以下:ui
sonar-checkstyle插件中,引用了checkstyle和sonar-plugin-api兩個jar包,這兩個jar包都引用了guava,可是版本不同,checkstyle使用guava 18.0,sonar-plugin-api使用guava 10.0.1。對於類 com.google.common.io.Closeables ,guava 18.0不兼容10.0.1【假如在pom文件中不指定guava版本的話,默認是用高版本】。sonar-checkstyle是經過maven的shade插件來解決guava版本不兼容的問題,具體作法:在sonar-checkstyle項目中創建checkstyle-all項目中經過【maven-shade-plugin】插件,將checkstyle中的guava18.0包合併到checkstyle包【com.puppycrawl.tools.checkstyle.guava】路徑下,並從新生成【checkstyle-all-2.5.2-SNAPSHOT.jar】包來替代checkstyle-6.12.1,在真正的sonar-checkstyle插件項目sonar-checkstyle-plugin中引用的 checkstyle-all,是來解決guava衝突的問題。google
可是,因爲 checkstyle-all 引用了checkstyle,致使 sonar-checkstyle-plugin間接引用了checkstyle,打包的時候,仍然將checkstyle打包進入 sonar-checkstyle-plugin的jar包。 類加載的時候依然加載的是 checkstyle,而不是替換checkstyle和guava18.0的 checkstyle-all,因此並無真正解決guava版本不兼容的問題。編碼
sonar-checkstyle-plugin項目在引用checkstyle-all的時候,排除引用checkstyle,又經過引用scope級別爲provided的checksytle包,來避免運行時沒法經過編譯的問題。spa
配置以下:
<dependency> <groupId>${project.groupId}</groupId> <artifactId>checkstyle-all</artifactId> <version>${project.version}</version> <!--排除原生的checkstyle軟件--> <exclusions> <exclusion> <groupId>com.puppycrawl.tools</groupId> <artifactId>checkstyle</artifactId> </exclusion> </exclusions> </dependency> <!--引用checkstyle軟件,僅供編碼使用--> <dependency> <groupId>com.puppycrawl.tools</groupId> <artifactId>checkstyle</artifactId> <version>${checkstyle.version}</version> <!-- 依賴jdk或容器提供 --> <scope>provided</scope> </dependency>