
简介SonarScanner 4.2.0.1873 的 Windows 版压缩包面向需要在本地或 CI 流程中做代码质量与安全扫描的开发者、测试与运维人员。它内置分析引擎、插件接口与数据库连接等依赖库并自带 JRE 运行环境无需额外安装 Java 即可在 Windows 上直接运行命令行脚本可传入项目路径、SonarQube 服务器地址与认证信息配合 conf 目录下的默认配置即可定制扫描行为支持 Java、C#、Python 等多语言项目。压缩包共 327 个文件约 37.77MB以 dll 动态库、license 与 additional_license_info 许可说明、assembly_exception 异常定义、exe 可执行程序、properties 配置、jar 包及 bat 脚本为主目录结构清晰便于按 lib、jre、bin、conf 等模块检索。已有 298 人学习下载适合希望快速搭建代码扫描环境、排查代码异味与安全漏洞的团队参考使用。1. 拿到 sonar-scanner 4.2.0 Windows 包先搞清楚它到底扫什么很多人第一次接触代码扫描是因为提交代码时被流水线卡住提示一堆「Bug」「Vulnerability」回头一查是 SonarQube 在背后干活。而真正把代码送进 SonarQube 的不是服务器本身是跑在本地或 CI 机器上的 sonar-scanner。这次拆的是sonar-scanner-4.2.0.1873-windows.zip一个 Windows 平台专用的命令行扫描客户端解压即用不需要装 Java 之外的额外运行时。它的职责很单一读取项目里的sonar-project.properties把源码、字节码、测试报告打包成分析请求发给 SonarQube 服务端服务端算完再把结果写回数据库。换句话说scanner 是「采集器」SonarQube 才是「分析大脑」。适合谁用本地想提前发现问题的开发、要在 Jenkins 或 GitLab CI 里加扫描环节的运维、以及需要给老项目补质量门禁的测试同学。搞清这个分工后面配置才不会把服务端和客户端的参数搞混。2. 解压后的目录结构与运行前置条件别急着敲命令2.1 目录里每个文件夹是干什么的把 zip 解压到任意路径比如D:\tools\sonar-scanner-4.2.0.1873-windows会看到四个关键目录。bin下是sonar-scanner.batWindows 的入口脚本conf下是sonar-scanner.properties全局配置通常只改sonar.host.urllib下是 scanner 自身的 jar 包不要手动动jre是内置的 Java 运行时4.2 版本自带 JRE所以机器上没装 JDK 也能跑。这里有个容易忽略的点内置 JRE 只保证 scanner 自己能启动但如果你的项目是 Java 且需要编译后再扫描项目本身的构建仍然要依赖你机器上的 JDK。常见做法是扫描前先mvn compile或gradle build让target/classes或build/classes存在scanner 才能读到字节码做更深的分析。2.2 环境变量与 PATH 的正确配法不配环境变量也能跑但每次都要写全路径CI 里很痛苦。推荐把bin目录加进系统 PATH。操作步骤右键「此电脑」→ 属性 → 高级系统设置 → 环境变量 → 在「系统变量」里找到 Path → 新建一条D:\tools\sonar-scanner-4.2.0.1873-windows\bin。保存后新开一个 cmd敲sonar-scanner -v能打印版本号就说明通了。注意不要用中文路径scanner 的批处理脚本对空格和中文的兼容性一般路径里带空格时偶尔会出现The system cannot find the path specified这是血泪经验直接放D:\tools这种纯英文短路径最省事。# 验证安装输出应包含 SonarScanner 4.2.0.1873 sonar-scanner -v # 如果没配 PATH用全路径调用 D:\tools\sonar-scanner-4.2.0.1873-windows\bin\sonar-scanner.bat -v上面第一条是配好 PATH 后的常规验证第二条是临时调用。参数-v只打印版本和 Java 信息不会触发扫描适合排查「到底是 scanner 没起来还是连不上服务端」。如果-v都报错问题一定在安装路径或 Java 环境跟 SonarQube 服务端无关别往网络方向查。2.3 全局配置文件里只改一行打开conf\sonar-scanner.properties里面默认全是注释。唯一需要动的是服务端地址# conf/sonar-scanner.properties # 指向你的 SonarQube 服务端注意不要带结尾斜杠 sonar.host.urlhttp://192.168.1.100:9000这行的作用是给所有项目提供默认的服务端地址。如果某个项目要连不同的 SonarQube可以在项目级sonar-project.properties里再写一次sonar.host.url覆盖它。参数说明地址必须是 scanner 能直连的端口默认 9000协议按实际填 http 或 https。改完不需要重启任何服务下次执行就生效。很多人改完不生效是因为项目级配置里也写了sonar.host.url项目级优先级更高把全局的盖掉了。3. 项目级配置 sonar-project.properties参数怎么填才不翻车3.1 最小可用配置模板在项目根目录建一个sonar-project.properties这是 scanner 真正读取的文件。一个能跑通的最小配置长这样# 项目唯一标识服务端用它区分不同项目不能重复 sonar.projectKeymy-web-app # 显示名称看报告时用 sonar.projectNameMy Web App # 版本号会显示在报告里 sonar.projectVersion1.0.0 # 源码目录多个用逗号分隔 sonar.sourcessrc # 编译产物目录Java 项目必填前端项目可省略 sonar.java.binariestarget/classes # 排除不需要扫描的目录 sonar.exclusions**/node_modules/**,**/dist/**,**/*.min.js逐项说明sonar.projectKey是核心服务端靠它判断是新建项目还是更新已有项目写错会导致每次扫描都建一个新项目。sonar.sources只写源码根目录不要写.否则会把node_modules、.git全扫进去速度慢到怀疑人生。sonar.exclusions用逗号分隔多个 glob 模式**匹配任意层级目录。sonar.java.binaries只在 Java 项目里需要指向编译后的 class 文件目录不填的话 Java 规则里依赖字节码的那部分不会执行报告会少很多问题。3.2 多模块项目的 sources 与 binaries 写法Maven 多模块项目最容易在这里翻车。假设父项目下有module-a、module-b两个子模块配置要写成sonar.projectKeymulti-module-demo sonar.projectNameMulti Module Demo sonar.projectVersion1.0.0 # 多个源码目录用逗号分隔 sonar.sourcesmodule-a/src/main/java,module-b/src/main/java # 多个字节码目录同样逗号分隔 sonar.java.binariesmodule-a/target/classes,module-b/target/classes # 测试代码单独指定 sonar.testsmodule-a/src/test/java,module-b/src/test/java逻辑说明scanner 不会自动递归识别 Maven 模块必须手动把每个模块的路径列全。sonar.tests和sonar.sources要分开测试代码的规则集和主代码不同混在一起会导致测试类被当成生产代码报一堆无关问题。参数上路径都是相对项目根目录的用正斜杠/而不是反斜杠Windows 下也建议用/scanner 内部会统一处理。如果模块很多手写容易漏常见做法是用脚本生成这段配置或者改用 Maven 的sonar-maven-plugin让插件自动推导路径但那就不是这个 zip 包的用法了。3.3 扫描命令与结果解读配置写好在项目根目录执行# 最简调用scanner 自动读取当前目录的 sonar-project.properties sonar-scanner # 临时覆盖服务端地址适合多环境切换 sonar-scanner -Dsonar.host.urlhttp://10.0.0.5:9000 # 打开调试日志排查连接和配置问题 sonar-scanner -X第一条是日常用法scanner 默认在当前目录找sonar-project.properties。第二条用-D传参优先级高于配置文件适合 CI 里同一份代码扫不同环境。第三条-X打开 debug 日志会打印每个参数的最终取值和 HTTP 请求详情连不上服务端时必用。执行成功后终端会输出ANALYSIS SUCCESSFUL并给一个服务端报告链接。如果卡在Waiting for report processing说明服务端在算等就行如果直接报Fail to request server检查sonar.host.url和网络连通性用浏览器访问一下那个地址看能不能打开。4. 避坑与常见问题排查这几条我全踩过4.1 现象执行报错java.lang.UnsupportedClassVersionError原因scanner 4.2 内置 JRE 是 Java 11但如果你手动设置了JAVA_HOME指向 Java 8scanner 会优先用JAVA_HOME的 Java导致 class 版本不兼容。解决要么把JAVA_HOME指向 Java 11要么在sonar-scanner.bat里强制用内置 JRE。最省事的做法是扫描时临时清掉JAVA_HOME让脚本走内置 JRE。4.2 现象扫描成功但报告里没有代码问题只有零星几条原因sonar.sources路径写错或者被sonar.exclusions误伤。比如写了sonar.sources.又加了sonar.exclusions**/*等于什么都没扫。解决用-X看日志里Included sources和Excluded sources两行确认实际扫描的文件列表。路径一律用相对路径别用绝对路径。4.3 现象sonar-scanner命令找不到提示不是内部或外部命令原因PATH 没配好或者配完没开新终端。Windows 的环境变量修改只对新开的进程生效已经开着的 cmd 读的是旧值。解决关掉所有 cmd 重新开一个再敲sonar-scanner -v。如果还不行检查 Path 里是不是写成了bin\sonar-scanner.batPATH 只需要目录不需要文件名。4.4 现象连接服务端超时报Connection refused原因sonar.host.url地址或端口写错或者服务端没启动。注意 4.2 的 scanner 默认连http://localhost:9000如果你服务端在别的机器不改配置就会连本地。解决先用浏览器访问sonar.host.url能打开 SonarQube 登录页说明地址对打不开就查服务端进程和防火墙。端口被占用也是常见情况Windows 下用netstat -ano | findstr 9000看谁占了。4.5 现象中文路径下扫描报The filename, directory name, or volume label syntax is incorrect原因scanner 的批处理脚本对中文和空格处理不完善路径里带中文时参数传递会乱码。解决把 scanner 解压目录和项目目录都放到纯英文无空格路径下比如D:\work\project。这是最容易被忽视的一条很多人卡半天以为是配置问题其实是路径里的中文在作祟。5. 进阶技巧把 scanner 塞进 CI 与本地预检的两种玩法5.1 本地预检提交前先扫一遍别等流水线打脸日常开发最实用的做法是在提交代码前手动跑一次扫描只扫改动相关的部分。虽然 scanner 不支持增量扫描但可以通过sonar.inclusions限定只扫某几个文件快速验证# 临时配置只扫指定文件验证完删掉 sonar.inclusionssrc/main/java/com/example/OrderService.java这个参数和sonar.exclusions相反是白名单模式。我一般会在改完核心逻辑后临时加上这行扫一下确认没有新增严重问题再提交。注意它只影响本次扫描范围不会改变服务端已有项目的整体数据扫完记得删掉否则下次全量扫描会漏文件。5.2 CI 集成Jenkins 里怎么调这个 zip 包Jenkins 的 Windows 节点上把 scanner 解压到固定路径然后在构建步骤里加一段批处理# Jenkins 构建步骤先编译再扫描 call mvn clean compile call D:\tools\sonar-scanner-4.2.0.1873-windows\bin\sonar-scanner.bat -Dsonar.host.urlhttp://sonar.internal:9000 -Dsonar.login%SONAR_TOKEN%参数说明sonar.login传的是 SonarQube 生成的 token不要用账号密码token 可以随时吊销更安全。%SONAR_TOKEN%是 Jenkins 凭据里注入的环境变量。call是必须的否则批处理执行完会直接退出后面的步骤不执行。如果构建失败但扫描本身没问题检查mvn compile是否成功scanner 依赖编译产物。5.3 验证扫描是否真的生效判断一次扫描有没有真正把问题写进服务端看两个地方终端最后输出的报告 URL打开能看到本次扫描的项目和问题数以及服务端项目页面的「Activity」标签会按时间列出每次分析记录。如果 Activity 里没有新记录说明扫描请求根本没到服务端回头查sonar.host.url和 token 权限。token 权限不足时scanner 会报Insufficient privileges去 SonarQube 的用户 token 页面重新生成一个带Execute Analysis权限的即可。从那以后我每次配新项目的sonar-project.properties都强制先跑一遍sonar-scanner -X看实际扫描文件列表确认路径没写歪再交给 CI。这个习惯帮我省了至少三次「报告为空」的排查时间。希望帮到你。本文还有配套的精品资源点击获取