使用Sonar Scanner扫描ArgoUML项目报错:需提供编译类文件
看起来你在扫描ArgoUML这个老项目时遇到了连锁问题:SonarQube需要编译后的类文件才能完成分析,但Maven构建一直失败。我来帮你一步步拆解解决:
先搞懂SonarQube报错的核心原因
Sonar Scanner分析Java项目时,必须读取编译生成的.class文件来做深度规则检查(比如字节码层面的合规性分析)。如果项目没编译,或者没明确告诉SonarQube这些文件的位置,就会抛出Please provide compiled classes of your project with sonar.java.binaries property错误。解决这个问题的前提是先让Maven成功构建项目。
解决Maven构建ArgoUML失败的常见方案
ArgoUML是一个比较老旧的项目(最后一次更新大概在2017年),它的构建依赖和JDK版本要求和现在的环境可能不兼容,常见问题和解决方法如下:
1. 强制指定兼容的JDK版本
ArgoUML的源码大概率基于JDK 8(甚至更早)编写,如果你现在用的是JDK 11+,编译时会出现语法或API兼容错误。可以在Maven命令里直接指定编译版本:
mvn clean package -Dmaven.compiler.source=1.8 -Dmaven.compiler.target=1.8 -DskipTests
如果还是不行,建议切换到JDK 8环境(比如用版本管理工具sdkman或jenv安装JDK 8),确保执行java -version显示的是JDK 8版本。
2. 跳过测试用例避免构建中断
老旧项目的测试用例可能因为环境变化(比如依赖库版本更新、系统差异)而失败,导致Maven的install或package命令中断。先跳过测试,优先保证编译打包成功:
# 仅跳过测试执行,不跳过测试编译 mvn clean package -DskipTests # 完全跳过测试的编译和执行(速度更快) mvn clean package -Dmaven.test.skip=true
3. 处理依赖下载失败的问题
有些旧项目的依赖可能已经从Maven中央仓库下架,或者你的Maven镜像没有同步这些依赖。可以尝试:
- 强制更新依赖缓存:
mvn clean install -U -DskipTests(-U参数会强制Maven更新快照和发布版本的依赖) - 如果某个依赖确实找不到,去Maven仓库搜索该依赖的坐标,手动下载JAR包后用以下命令安装到本地仓库:
mvn install:install-file -Dfile=/path/to/your/dependency.jar -DgroupId=com.example -DartifactId=dependency-name -Dversion=1.0.0 -Dpackaging=jar
(替换命令里的路径、groupId、artifactId、version为实际依赖信息)
构建成功后执行Sonar Scanner
当Maven构建完成后,项目的编译类文件会默认放在target/classes目录(多模块项目则每个子模块都有自己的target/classes)。此时执行Sonar Scanner时,明确指定sonar.java.binaries路径即可:
# 单模块项目 sonar-scanner \ -Dsonar.projectKey=argouml \ -Dsonar.projectName=ArgoUML \ -Dsonar.java.binaries=target/classes \ -Dsonar.host.url=http://你的SonarQube地址 \ -Dsonar.login=你的SonarQube令牌
如果是多模块项目,需要列出所有子模块的编译类路径:
sonar-scanner \ -Dsonar.projectKey=argouml \ -Dsonar.projectName=ArgoUML \ -Dsonar.java.binaries=argouml-core/target/classes,argouml-ui/target/classes \ -Dsonar.host.url=http://你的SonarQube地址 \ -Dsonar.login=你的SonarQube令牌
额外提示
如果Maven构建时还有具体的错误信息(比如某个类找不到、某个插件报错),可以把错误日志贴出来,这样能更精准地定位问题。比如如果是javax.servlet这类旧API缺失,可能需要在pom.xml中添加对应的依赖。
内容的提问来源于stack exchange,提问作者RedHood148

