SonarQube 5.6.2配置报错:指定sonar.java.binaries仍提示需提供编译类
解决SonarQube多模块Java项目扫描时找不到编译类的问题
针对你在使用SonarQube 5.6.2、SonarQube Scanner 2.5.1和Maven 3.2.5时遇到的org.sonar.squidbridge.api.AnalysisException: Please provide compiled classes of your project with sonar.java.binaries property错误,我整理了几个针对性的解决步骤:
1. 修复多模块项目的路径配置
因为是多模块结构,硬编码sonar.java.binaries=target/classes会导致Sonar从父项目根目录查找该路径,而不是每个子模块自己的target/classes。这是最常见的问题。
- 解决方法:在父pom.xml的
<properties>中使用Maven内置变量${project.build.outputDirectory},它会自动指向当前模块的编译输出目录:<properties> <sonar.java.binaries>${project.build.outputDirectory}</sonar.java.binaries> </properties>
2. 确保项目已完成完整编译
Sonar扫描必须依赖已生成的class文件,如果扫描前没有编译项目,target/classes目录会是空的,自然触发错误。
- 解决方法:先执行编译命令再启动Sonar扫描,多模块项目推荐用
install确保子模块依赖也被正确编译:mvn clean install -DskipTests mvn sonar:sonar
3. 检查自定义编译目录
如果某些子模块在pom.xml中自定义了编译输出目录(比如修改了<build><outputDirectory>),默认的target/classes就不存在了。
- 解决方法:检查所有子模块的pom配置,确认编译输出路径,或者直接沿用
${project.build.outputDirectory}变量,它会自动适配自定义路径。
4. 手动指定多模块路径(备选方案)
如果不想用Maven变量,也可以直接指定所有子模块的classes路径,用逗号分隔:
sonar.java.binaries=module-a/target/classes,module-b/target/classes,module-c/target/classes
不过这种方式不够灵活,模块增减时需要手动修改,优先推荐用Maven变量的方案。
5. 启用Debug日志定位问题
按照错误提示,添加-X参数重新运行扫描,能看到Sonar实际查找的路径详情,方便精准定位:
mvn sonar:sonar -X
在日志中搜索JavaClasspath相关的输出,就能看到Sonar实际在尝试访问哪些目录,判断是否路径有误。
附你遇到的错误日志:
INFO: JavaClasspath initialization INFO: ------------------------------------------------------------------------ INFO: EXECUTION FAILURE INFO: ------------------------------------------------------------------------ INFO: Total time: 33.798s INFO: Final Memory: 75M/3927M INFO: ------------------------------------------------------------------------ ERROR: Error during SonarQube Scanner execution org.sonar.squidbridge.api.AnalysisException: Please provide compiled classes of your project with sonar.java.binaries property at org.sonar.java.JavaClasspath.init(JavaClasspath.java:59) at org.sonar.java.AbstractJavaClasspath.getElements(AbstractJavaClasspath.java:281) at org.sonar.java.SonarComponents.getJavaClasspath(SonarComponents.java:141) at org.sonar.java.JavaSquid.(JavaSquid.java:83) at org.sonar.plugins.java.JavaSquidSensor.execute(JavaSquidSensor.java:83) at org.sonar.batch.sensor.SensorWrapper.analyse(SensorWrapper.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:192) 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:241) at org.sonar.batch.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:236) at org.sonar.batch.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:226) at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:142) at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:127) at org.sonar.batch.task.ScanTask.execute(ScanTask.java:47) 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:106) at org.sonar.batch.bootstrapper.Batch.executeTask(Batch.java:119) at org.sonar.runner.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:67) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.sonar.runner.impl.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:61) at com.sun.proxy.$Proxy0.execute(Unknown Source) at org.sonar.runner.api.EmbeddedRunner.doExecute(EmbeddedRunner.java:274) at org.sonar.runner.api.EmbeddedRunner.runAnalysis(EmbeddedRunner.java:165) at org.sonar.runner.api.EmbeddedRunner.runAnalysis(EmbeddedRunner.java:152) at org.sonarsource.scanner.cli.Main.runAnalysis(Main.java:133) at org.sonarsource.scanner.cli.Main.execute(Main.java:82) at org.sonarsource.scanner.cli.Main.main(Main.java:66) ERROR: ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging. Build step 'Invoke Standalone SonarQube Analysis' marked build as failure Deleting 1 temporary files
内容的提问来源于stack exchange,提问作者Akash Yadav
相关产品推荐
相关产品推荐

