SonarQube 在分析你的项目时,发现项目中存在 .java
源文件却没有提供对应的已编译 .class
文件,因此报出了以下异常:
org.sonar.java.AnalysisException: Your project contains .java files, please provide compiled classes with sonar.java.binaries property...
换句话说,Sonar 在做 Java 代码分析时需要看到编译后生成的字节码,否则无法进行完整的语言规则扫描。出现这个问题通常有以下几种原因:
-
未编译就扫描
- 在本地或流水线中没有先执行
mvn compile
/mvn package
/gradle build
等编译命令,导致 Sonar 无法找到.class
文件。
- 在本地或流水线中没有先执行
-
编译目录路径未正确传给 Sonar
- 对于 Maven 项目,编译生成的
.class
文件一般在target/classes
下;Gradle 则一般在build/classes/java/main
下。 - 如果你采用了自定义输出目录,或者多模块目录结构,需要显式配置
sonar.java.binaries
来告诉 Sonar “.class 文件在哪”。
- 对于 Maven 项目,编译生成的
-
要扫描的目录仅有源文件,无需 Java 分析
- 如果那部分代码只是示例或不需要 Java 规则扫描,你也可以通过
sonar.exclusions
把它们排除掉,避免报错。
- 如果那部分代码只是示例或不需要 Java 规则扫描,你也可以通过
建议解决办法
-
确保先编译再扫描
- 如果是 Maven:
mvn clean install sonar:sonar
- 如果是 Gradle:
gradle clean build sonarqube
- 这样 Sonar 会自动发现编译产物所在目录。
- 如果是 Maven:
-
显式指定
sonar.java.binaries
- 若编译输出目录不在默认位置,需要在 Sonar 命令或
sonar-project.properties
中指定,例如:sonar.java.binaries=target/classes
- 对 Gradle 可能是:
sonar.java.binaries=build/classes/java/main
- 若编译输出目录不在默认位置,需要在 Sonar 命令或
-
排除不需要分析的源码
- 在
sonar-project.properties
或全局设置中使用sonar.exclusions
:sonar.exclusions=**/example/**, **/demo/**
- 在
-
确认以下是不是源代码写的有问题,大概率是这个原因
只要让 SonarQube 在分析 Java 源文件的同时能够关联到对应 .class
文件,或干脆排除不需要的代码目录,就能避免这个报错了。