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 会破坏扫描仪的主要内容,如果未能解决你的问题,请参考以下文章