首页
/
行业洞察
/
正文
INDUSTRY INSIGHT · 深度
sonarqube-7.4 内网部署实战:从解压到扫描的完整指南
📅 2026/10/18 5:08:09
✍️ 爱科研究院
👁 阅读 3,247
简介SonarQube 7.4 是一款开源代码质量管理工具的完整安装包面向 Java、Python、C#、JavaScript 等多语言开发者及需要搭建代码质量平台的团队。它可帮助发现代码漏洞、代码异味与复杂度问题并支持与 Jenkins、GitLab CI/CD 等持续集成工具对接实现自动化质量检查。压缩包为 rar 格式整体约 161.38MB内含 bin、conf、extensions、lib、web、libexec 等目录及 README、LICENSE 文件分别用于服务启停脚本、数据库与端口配置、插件扩展、运行库、前端界面资源和辅助工具解压后即可按官方流程完成部署。目前已有 637 人学习下载适合希望快速获取稳定版本、避开官网下载缓慢问题的开发者。通过该资源读者可省去繁琐的下载等待直接获得可运行的 7.4 版本便于本地搭建质量分析环境、研究目录结构与配置方式并在此基础上接入插件与持续集成流程提升代码维护效率。1. 从一台老服务器上翻出的 sonarqube-7.4它还能干什么前阵子帮一个做内部工具链维护的朋友整理旧资产在一台退役的测试机上翻出一份 sonarqube-7.4 的完整部署包。他第一反应是“这版本太老了直接删了吧”但我拦住了——因为我知道很多中小团队的内网代码质量管理恰恰就卡在“新版跑不动、旧版没人会装”这个尴尬区间里。sonarqube-7.4 这个版本对 JDK 和数据库的要求相对宽松MySQL 5.6/5.7 就能撑起来不需要动辄上 Docker Compose 编排一堆中间件特别适合那些只有一两台内网机器、又想给 Java 和前端项目做静态扫描的团队。它解决的核心问题很朴素把代码里的坏味道、重复率、潜在空指针、SQL 拼接风险用一套 Web 界面集中呈现出来而不是靠人肉 Review 碰运气。如果你手头正好有这份资源或者正在评估要不要用它下面我按实际拆包、部署、接项目的顺序把能复现的步骤和踩过的坑一次讲清楚。2. sonarqube-7.4 的组成与运行前置条件2.1 解压后先看目录别急着启动拿到 sonarqube-7.4 的压缩包解压后根目录下通常有这几个关键文件夹bin放各平台启动脚本conf放sonar.properties主配置data是运行时索引和 H2 内嵌库的落盘位置extensions放插件lib是核心依赖。我一般先执行du -sh看整体体积再进conf把sonar.properties里所有被注释的数据库配置项过一遍。很多人翻车就翻在直接./sonar.sh start结果它默认用 H2 内存库跑起来了数据写进data目录重启就丢还以为是软件坏了。# 查看解压后的顶层结构确认没有缺目录 ls -lh /opt/sonarqube-7.4 # 重点看 conf 下的主配置和 wrapper 配置 ls -l /opt/sonarqube-7.4/conf/ # 检查当前 JDK 版本7.4 官方要求 JDK 8别用 11 去硬跑 java -version逻辑说明ls两行是为了确认包完整java -version是前置校验。参数上sonarqube-7.4 对 JDK 8 的兼容性最稳JDK 11 虽然部分场景能起但 Web 端偶发类加载异常不建议在生产内网用。如果机器上默认是 JDK 11用update-alternatives切到 8或者直接在sonar.sh里显式指定JAVA_HOME。2.2 数据库选型MySQL 5.7 是性价比最高的落点sonarqube-7.4 支持 H2、MySQL、PostgreSQL、Oracle、SQL Server。H2 只适合本地临时验证一旦你要保留历史扫描记录、做趋势图就必须换外部库。我一般选 MySQL 5.7因为它的utf8mb4字符集和innodb引擎在这个版本下配合最顺而且大多数内网机器上本来就跑着 MySQL不用额外装 PostgreSQL。建库时注意两点字符集用utf8而不是utf8mb47.4 的 JDBC 驱动对四字节字符支持有瑕疵排序规则用utf8_general_ci另外给 sonar 单独建一个用户别用 root。-- 创建 sonar 专用库字符集按 7.4 的兼容性要求来 CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci; -- 建独立用户并授权避免 root 直连 CREATE USER sonar% IDENTIFIED BY Sonar2024; GRANT ALL PRIVILEGES ON sonar.* TO sonar%; FLUSH PRIVILEGES;逻辑说明CHARACTER SET utf8是 7.4 的硬性建议用utf8mb4在扫描含 emoji 的源码注释时可能报Incorrect string value。sonar%允许从其他内网机器连如果 sonar 和 MySQL 同机改成sonarlocalhost更安全。密码里带在sonar.properties里要转义或加引号后面配置会讲。2.3 改 sonar.properties四个必须动的参数打开conf/sonar.properties找到被注释的 MySQL 段把下面四项填上。很多人只填了 URL 和账号密码忘了sonar.jdbc.maxActive结果并发扫描时连接池不够报Connection is not available。# 数据库连接串注意 useUnicode 和 characterEncoding 要带上 sonar.jdbc.urljdbc:mysql://127.0.0.1:3306/sonar?useUnicodetruecharacterEncodingutf8rewriteBatchedStatementstrueuseConfigsmaxPerformance sonar.jdbc.usernamesonar sonar.jdbc.passwordSonar2024 # 连接池上限内网小团队 20 够用扫描任务多就调到 50 sonar.jdbc.maxActive20 # Web 端口默认 9000被占就改这里 sonar.web.port9000 # Web 上下文路径如果前面挂了 nginx 做子路径转发才需要改 sonar.web.context/逻辑说明rewriteBatchedStatementstrue能显著加快批量插入扫描大项目时索引写入快不少。useConfigsmaxPerformance是 MySQL 驱动自带的性能配置模板。sonar.web.port如果和机器上其他服务冲突改成 9100 之类改完要同步防火墙规则。sonar.web.context保持/最省事除非你有统一网关要求所有服务走/sonar前缀。3. 启动、初始化与第一个扫描任务3.1 用 sonar.sh 启动并确认日志没有报错配置改完进bin/linux-x86-64执行启动。别用nohup直接跑wrapper用自带的sonar.sh脚本它会处理 PID 文件和日志轮转。# 进入启动脚本目录 cd /opt/sonarqube-7.4/bin/linux-x86-64 # 启动服务 ./sonar.sh start # 查看启动状态确认是 Running ./sonar.sh status # 实时跟日志重点看 web.log 和 sonar.log tail -f /opt/sonarqube-7.4/logs/web.log逻辑说明sonar.sh start会先后拉起 Elasticsearch7.4 内置的搜索节点和 Web 进程。如果status显示Stopped先看logs/sonar.log里有没有AccessDeniedException那通常是data目录权限不对用chown -R把整个 sonarqube 目录给运行用户。web.log里出现Database connection succeeded才算数据库通了出现Failed to connect就回头检查sonar.properties里的密码有没有被截断。3.2 首次登录与强制改密浏览器打开http://内网IP:9000默认账号admin密码admin。7.4 会强制你第一次登录后改密码改完才能进主界面。这一步别跳过也别用弱密码因为 sonar 的 Web API 默认没有额外鉴权层内网里谁都能扫到端口。# 如果忘了改后的密码可以连数据库重置但更推荐用 API curl -u admin:旧密码 -X POST http://127.0.0.1:9000/api/users/change_password?loginadminpassword新密码previousPassword旧密码逻辑说明change_password接口在 7.4 里可用参数login指定要改的用户previousPassword是旧密码。如果旧密码也忘了只能进 MySQL 的users表把crypted_password字段清空重启后会用默认逻辑重置但这样会丢历史配置属于后悔药尽量别走到这一步。3.3 装中文包和 Java 扫描插件7.4 默认界面是英文内网团队用的话建议装中文语言包。进Administration - Marketplace搜Chinese找到Chinese Pack安装重启后界面变中文。Java 项目还需要确认Java插件已启用7.4 自带SonarJava4.x 版本支持到 Java 8 的语法分析Java 11 的部分新特性识别不全这是版本边界心里要有数。# 如果 Marketplace 连不上外网手动下载插件包放到 extensions/plugins # 中文包文件名类似 sonar-l10n-zh-plugin-1.28.jar cp sonar-l10n-zh-plugin-1.28.jar /opt/sonarqube-7.4/extensions/plugins/ # 改完插件必须重启 ./sonar.sh restart逻辑说明extensions/plugins是插件加载目录放进去后重启才会生效。手动放插件时注意版本匹配7.4 对应的中文包版本不能太新否则 API 不兼容会导致 Web 起不来。重启后看web.log有没有Plugin [l10nzh] is incompatible之类的报错。4. 把 Maven 项目接进来扫描器配置与参数调优4.1 生成项目 Token 而不是用账号密码在 Web 界面点右上角头像 - 我的账号 - 安全生成一个 Token比如sqp_abc123...。扫描时用 Token 而不是admin账号密码好处是权限可控、可随时吊销。然后在项目根目录的pom.xml里加sonar-maven-plugin或者直接用命令行指定。!-- pom.xml 里加插件版本用 7.4 兼容的 3.6.0.1398 -- plugin groupIdorg.sonarsource.scanner.maven/groupId artifactIdsonar-maven-plugin/artifactId version3.6.0.1398/version /plugin逻辑说明3.6.0.1398是 sonarqube-7.4 时期配套的扫描器版本用太新的4.x扫描器会报Unsupported major.minor version或 API 不匹配。如果项目里已经有其他版本的 sonar 插件用mvn org.sonarsource.scanner.maven:sonar-maven-plugin:3.6.0.1398:sonar显式指定版本执行避免继承冲突。4.2 执行扫描并传入必要参数在项目根目录执行下面这条命令把 Token、主机地址、项目 Key 都传进去。项目 Key 建议用groupId:artifactId格式方便在 Web 端按模块筛选。mvn clean verify sonar:sonar \ -Dsonar.host.urlhttp://127.0.0.1:9000 \ -Dsonar.loginsqp_abc123... \ -Dsonar.projectKeycom.example:demo-service \ -Dsonar.projectNameDemo服务 \ -Dsonar.java.binariestarget/classes \ -Dsonar.sourceEncodingUTF-8逻辑说明sonar.java.binaries必须指向编译后的 class 目录否则 Java 规则里依赖字节码的分析比如空指针、资源未关闭跑不起来这是新手最容易漏的参数。sonar.sourceEncodingUTF-8防止中文注释乱码导致解析失败。mvn clean verify先保证编译通过再触发扫描避免扫到一半报编译错误。4.3 排除目录与忽略规则扫描时如果不排除target、node_modules、*.min.js索引会膨胀得很快Web 端加载也卡。在项目根目录建sonar-project.properties或者在 Maven 命令里加-Dsonar.exclusions。# sonar-project.properties 示例 sonar.exclusions**/target/**,**/node_modules/**,**/*.min.js,**/generated/** sonar.coverage.exclusions**/dto/**,**/config/** sonar.cpd.exclusions**/dto/**逻辑说明sonar.exclusions是全局排除不扫描也不索引。sonar.coverage.exclusions只影响覆盖率统计代码仍会被分析。sonar.cpd.exclusions排除重复代码检测DTO 类通常结构相似不排除的话重复率会虚高导致质量门禁误报。5. 避坑与常见问题排查5.1 启动报 Elasticsearch 无法绑定端口现象sonar.sh start后status显示Stoppedlogs/es.log里出现BindException: Address already in use。原因7.4 内置的 Elasticsearch 默认用 9001 端口做节点通信如果机器上已有其他 ES 实例或服务占用了 9001就会冲突。解决改conf/sonar.properties里的sonar.search.port9001为其他空闲端口比如 9002同时确认sonar.cluster.name没有和现有 ES 集群重名。5.2 扫描时提示“Not authorized”或 401现象mvn sonar:sonar执行到上传分析报告时报Not authorized。原因Token 复制时带了空格或者 Token 对应的用户被停用了。解决重新生成 Token复制时确认首尾无空白检查Administration - Security - Users里该用户状态是Active。另外如果 sonar 前面挂了 nginx确认proxy_set_header Authorization $http_authorization有透传否则 Token 在代理层就被丢了。5.3 中文注释导致解析失败现象扫描日志里出现Unable to parse source file定位到某个含中文注释的 Java 文件。原因文件实际编码是 GBK但sonar.sourceEncoding设成了 UTF-8或者反过来。解决统一项目源码为 UTF-8Maven 里配project.build.sourceEncodingUTF-8扫描命令里也显式传-Dsonar.sourceEncodingUTF-8。如果历史文件改不动用file -i逐个确认编码对 GBK 文件单独用-Dsonar.sourceEncodingGBK跑一次但长期看还是统一编码最省心。5.4 质量门禁一直不通过但找不到原因现象扫描成功但项目状态是Failed点进去看指标都正常。原因7.4 默认的Sonar way质量门禁里有一条“新代码重复率不超过 3%”而新加的 DTO 或配置文件被算进了重复率。解决进Quality Gates把sonar.cpd.exclusions配到项目级或者在门禁里把重复率阈值放宽到 5%。更稳妥的做法是给 DTO 单独建一个排除规则别让它们参与重复检测。5.5 数据库连接池耗尽导致扫描中断现象多个项目同时扫描时部分任务报Connection is not available, request timed out。原因sonar.jdbc.maxActive默认值偏小7.4 默认好像是 10并发扫描时不够用。解决调到 30 到 50同时确认 MySQL 的max_connections也够。另外扫描任务尽量错峰别在同一分钟触发十几个项目的 CI 扫描。6. 用 API 做批量项目接入与数据导出6.1 用 Web API 批量创建项目当内网有几十个仓库要接入时一个个在界面点太慢。7.4 的/api/projects/create接口可以批量建项目配合curl循环调用。# 从文件读取项目列表每行一个 projectKey 和 name while IFS, read -r key name; do curl -s -u sqp_abc123...: -X POST \ http://127.0.0.1:9000/api/projects/create \ --data-urlencode project$key \ --data-urlencode name$name echo created: $key done projects.csv逻辑说明-u sqp_abc123...:注意 Token 后面跟一个冒号表示空密码这是 sonar API 的认证格式。--data-urlencode防止项目名里有中文或特殊字符导致请求失败。projects.csv每行格式是com.example:svc-a,SvcA服务。这个脚本跑完Web 端项目列表就全出来了省去大量手工点击。6.2 导出指标数据做周报7.4 的/api/measures/component可以拉取指定项目的指标配合jq解析后写进表格用于内网周报。# 拉取指定项目的覆盖率、重复率、坏味道数量 curl -s -u sqp_abc123...: \ http://127.0.0.1:9000/api/measures/component?componentcom.example:demo-servicemetricKeyscoverage,duplicated_lines_density,code_smells \ | jq .component.measures[] | {metric: .metric, value: .value}逻辑说明metricKeys支持逗号分隔多个指标常用的还有bugs、vulnerabilities、ncloc。jq把返回的 JSON 拍平成metric和value两列方便直接贴进周报模板。如果内网机器没装jq用python -m json.tool也能看只是格式化后不好直接取字段。6.3 一个我常犯的错忘了清旧扫描缓存sonarqube-7.4 的data目录下会累积es索引和web缓存跑久了磁盘会涨。我一般每个月执行一次./sonar.sh stop然后删data/es下的旧索引保留data/web再启动。注意别删整个data否则项目配置和历史数据全丢。这个习惯是从一次磁盘写满导致 Web 起不来的事故后养成的从那以后我每次扩容或迁移前都强制走一遍du -sh data/*确认占用。希望帮到你。本文还有配套的精品资源点击获取
📌 标签:
工业官网
设计趋势
AI 建站
SEO
获取完整报告 →
RELATED ARTICLES
推荐阅读
2026/10/18 5:08:09
Oracle时区升级实战:DBMS_DST_scriptsV1.9安装与避坑指南
2026/10/18 5:08:09
存算分离架构下的缓存中间件:原理、部署与性能调优实践
2026/10/18 5:03:09
MapReduce核心原理与实战调优:从数据清洗到分布式计算思想
2026/10/18 6:03:13
Playwright Trace Viewer:自动化测试的完整证据链
2026/10/18 6:03:13
C语言strlen函数深度解析:原理、陷阱与性能优化
2026/10/18 6:03:13
AI智能体项目实战记录(05):RAG项目实战之向量知识库milvus部署
2026/10/18 6:03:13
PCA 的降维陷阱:数学最优,现实灾难
2026/10/18 6:03:13
技嘉网卡驱动下载,用对方法十分钟就能恢复网络
2026/10/18 5:58:12
基于Matlab的储能优化配置:灵活性供需不确定性建模与求解
2026/10/18 0:02:43
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/18 0:02:43
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/18 0:02:43
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/18 0:02:43
OpenResearch实战:Claude Code、Codex、OpenCode、Cursor 工作流搭建与故障排查
2026/10/18 0:02:43
知识管理核弹:用Obsidian构建第二大脑的工程化方案(TaoToken 统一 Key 接入版)
2026/10/18 0:02:43
金融AI落地指南:从调研报告到技术选型与工程实践
2026/10/17 10:15:50
我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
2026/10/16 18:46:48
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026/10/16 18:46:46
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)