SonarQube 从 6.4 升级到 6.5 会破坏扫描仪

Posted

技术标签:

【中文标题】SonarQube 从 6.4 升级到 6.5 会破坏扫描仪【英文标题】:SonarQube upgrade from 6.4 to 6.5 breaks the scanner 【发布时间】:2018-01-28 15:08:38 【问题描述】:
    我在 sonarQube6.4 上并已升级到 6.5 声纳扫描仪是 3.0.3 现在升级后扫描仪会在源路径中有 java 文件时失败。如果我不扫描 java 文件,一切正常。 但是,如果我回滚使用 6.4 版本,一切正常,那么是否有任何回归?这是堆栈跟踪,当我使用 -X 命令运行扫描仪命令时。那么在 6.5 中是否要求提供所有已编译类的位置,有没有办法忽略它。

04:56:21.218 调试:传感器:JavaSquidSensor -> SurefireSensor -> JaCoCoSensor -> SonarJavaXmlFileSensor -> “php.ini”文件分析器 -> 零覆盖传感器 -> CPD 块索引器 04:56:21.218 信息:传感器 JavaSquidSensor [java] 04:56:21.558 信息:配置的 Java 源 版本(sonar.java.source):无 04:56:21.565 信息:JavaClasspath 初始化 04:56:21.570 信息: -------------------------------------------------- ---------------------- 04:56:21.571 信息:执行失败 04:56:21.571 信息: -------------------------------------------------- ---------------------- 04:56:21.571 信息:总时间:6.545s 04:56:21.707 信息:最终记忆: 51M/1083M 04:56:21.707 信息: -------------------------------------------------- ---------------------- 04:56:21.707 错误:SonarQube 扫描仪执行期间出错 org.sonar.squidbridge.api.AnalysisException:请提供编译好的 具有 sonar.java.binaries 属性的项目类 在 org.sonar.java.JavaClasspath.init(JavaClasspath.java:59) 在 org.sonar.java.AbstractJavaClasspath.getElements(AbstractJavaClasspath.java:281) 在 org.sonar.java.SonarComponents.getJavaClasspath(SonarComponents.java:141) 在 org.sonar.java.JavaSquid.(JavaSquid.java:83) 在 org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:83) 在 org.sonar.scanner.sensor.SensorWrapper.analysis(SensorWrapper.java:53) 在 org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:88) 在 org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:82) 在 org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:68) 在 org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:78) 在 org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:179) 在 org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:144) 在 org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:129) 在 org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:261) 在 org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:256) 在 org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:245) 在 org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:144) 在 org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:129) 在 org.sonar.scanner.task.ScanTask.execute(ScanTask.java:47) 在 org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:84) 在 org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:144) 在 org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:129) 在 org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:119) 在 org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:116) 在 org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:63) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60) 在 com.sun.proxy.$Proxy0.execute(未知来源) 在 org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:233) 在 org.sonarsource.scanner.api.EmbeddedScanner.runAnalysis(EmbeddedScanner.java:151) 在 org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:123) 在 org.sonarsource.scanner.cli.Main.execute(Main.java:77) 在 org.sonarsource.scanner.cli.Main.main(Main.java:61) 04:56:21.710 调试:执行 getVersion 04:56:21.711 调试:执行 停止

当我使用 6.4 运行相同的程序时,它运行良好,我在控制台中看到的唯一警告是:

04:52:42.738 警告:未提供依赖项的字节码来分析源文件,您最终可能会得到不太精确的结果。可以使用 sonar.java.libraries 属性提供字节码

【问题讨论】:

插件版本很重要,看来你的两个SonarQube可能运行不同的SonarJava版本。 同意,在 6.4 中它是 sonar-java-plugin-4.9.0.9858.jar,而在 6.5 中它是 sonar-java-plugin-4.12.0.11033.jar,但我仍然相信这是一个回归,在新插件中,必须提供 .class 文件位置。我希望有一个选项来覆盖它 【参考方案1】:

SonarQube 扫描仪执行期间出错 org.sonar.squidbridge.api.AnalysisException:请提供编译好的 具有 sonar.java.binaries 属性的项目类

从 SonarJava 4.12 开始,必须指定 sonar.java.binaries 属性https://docs.sonarqube.org/display/PLUG/Java+Plugin+and+Bytecode

例子:

sonar-scanner -Dsonar.projectKey=fr.demo:my-project -Dsonar.sources=. -Dsonar.java.binaries=.

【讨论】:

你为android项目提供了什么java.binaries? @Mrityunjeyan S :你可以在这里找到一个例子:android.jlelse.eu/… "sonar.sources=app/src/main/java" "sonar.java.binaries=target/classes" 如果你执行 sonar -scanner,参数为“-Dsonar.sources=app/src/main/java”和“-Dsonar.java.binaries=target/classes” 根据自己的应用路径适配路径。【参考方案2】:

错误信息说:

Error during SonarQube Scanner execution org.sonar.squidbridge.api.AnalysisException:
Please provide compiled classes of your project with sonar.java.binaries property

除了.java 文件之外,Java 传感器似乎还需要.class 文件。

你可以:

将这些文件添加到分析中(顺便说一下,它会为您提供更有价值的声纳发现!) 尝试添加和删除文件以找出导致问题的代码片段并将其报告为 Sonar Java 错误

【讨论】:

您好,感谢您的宝贵时间。我同意,使用字节码访问分析结果会更准确。然而事实是我们不对 GIT 中的类文件进行版本控制,因此当我们将其作为带有版本控制的简单触发器调用时,无法访问这些 .classes,因此它现在中断,这与 6.4 不同 @PrashantSaddi 你能在运行代码编译的同一台机器上运行分析吗? 我实际上是在尝试将 SQ 用作 jenkins 构建的一部分,因此这取决于用户如何设置其声纳属性。我很确定他们没有这个属性,所以请求 100 个不同的团队来更改他们的工作可能并不容易,所以也许我们等待一个允许二进制位置可选的未来版本【参考方案3】:

我也遇到了这个问题,我通过以下方式解决了这个问题:

This page 提到了一个条目,该条目以前是可选的,但在最新更新 (4.12) 期间成为强制性条目。它说应该设置 Jenkins 项目设置中的 sonar.java.binaries 条目。设置后,即使是错误的文件夹,它也会修复您的错误,只留下警告,您的管道将再次运行。

该设置应该添加到 Jenkins -> “你的项目” -> 配置 -> 构建 -> 执行 SonarQube 扫描仪 -> 分析属性。添加此条目并将其指向您的二进制文件夹。

【讨论】:

【参考方案4】:

SonarQube 升级到最新的 6.5 版本后,即使我也面临同样的问题。但是在降级 SonarJava 插件(从 4.12 到 4.11)后,它工作了。 希望对你有帮助。

【讨论】:

谢谢 Ben,这将解决问题,因为我的 SQ 6.4 确实带有 SonarJava4.9 并且运行良好 @PrashantSaddi 是的,我同意,但在更新插件后我遇到了这个问题。但降级后它起作用了。

以上是关于SonarQube 从 6.4 升级到 6.5 会破坏扫描仪的主要内容,如果未能解决你的问题,请参考以下文章

扫描后未在 sonarqube 中更新项目

CentOS 6.5(6.4)安装过程图文教程

从 SonarQube 4.5.4 LTS 升级到 5.3 后,Ant 分析无法删除文件

CentOS6.5升级内核到3.10.28 --已验证

centOS 6.5下升级mysql,从5.1升级到5.6

XENSERVERC从6.5升级到7.0