SonarSource/sonar-java
GitHub: SonarSource/sonar-java
Sonar 官方 Java 静态代码分析器,提供代码质量和安全漏洞检测能力,是 SonarQube 平台的 Java 语言插件核心。
Stars: 1194 | Forks: 722
# Java 代码质量与安全 [](https://github.com/SonarSource/sonar-java/actions/workflows/build.yml) [](https://next.sonarqube.com/sonarqube/dashboard?id=org.sonarsource.java%3Ajava) [](https://next.sonarqube.com/sonarqube/component_measures/domain/Coverage?id=org.sonarsource.java%3Ajava)
此 Sonar 项目是一个针对 Java 项目的代码分析器,旨在帮助开发者实现集成的代码质量和安全。有关 Java 特性分析的信息可在[此处](https://redirect.sonarsource.com/plugins/java.html)获取。
## 功能特性
* 600+ 条规则(包括 150+ 条 Bug 检测规则和 350+ 条代码异味)
* 指标(认知复杂度、代码行数等)
* 导入[测试覆盖率报告](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/test-coverage/java-test-coverage/)
* [自定义规则](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/languages/java/#custom-rules)
## 实用链接
* [项目主页](https://redirect.sonarsource.com/plugins/java.html)
* [问题追踪](https://jira.sonarsource.com/browse/SONARJAVA/)
* [可用规则](https://rules.sonarsource.com/java)
* [Sonar 社区论坛](https://community.sonarsource.com/)
* [演示项目分析](https://next.sonarqube.com/sonarqube/dashboard?id=org.sonarsource.java%3Ajava)
* [插件 Wiki](https://github.com/SonarSource/sonar-java/wiki)
## 有问题或反馈?
如需提供反馈(请求新功能、报告 Bug 等),请使用 [Sonar 社区论坛](https://community.sonarsource.com/)。请务必指定语言(Java!)、插件版本和 SonarQube Server 版本。
如果您有关于如何使用插件的问题(且[文档](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/languages/java/)未能帮到您),我们也鼓励您使用社区论坛。
### Sonar 社区论坛主题
如需请求新功能,请在 [Sonar 社区论坛](https://community.sonarsource.com/)中创建一个新话题。即使您计划自己实现并将其提交回社区,也请先开启一个新话题,以确保我们可以使用它。
### Pull Request (PR)
如需提交贡献,请为此仓库创建一个 pull request。请确保您遵循我们的[代码风格](https://github.com/SonarSource/sonar-developer-toolset#code-style),并且所有[测试](#testing)都通过(所有检查必须为绿色)。
### 自定义规则
如果您有一个规则的想法,但不确定是否每个人都需要它,您可以实现一个仅供您自己使用的[自定义规则](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/languages/java/)。请注意,为了帮助您,我们强烈建议在直接从头开始实现规则之前,先遵循 [Custom Rules 101 教程](https://redirect.sonarsource.com/doc/java-custom-rules-guide.html)。
### 加入我们
您想全职从事这个项目吗?我们在招聘!查看 https://www.sonarsource.com/hiring
##
测试
要在本地运行测试,请遵循这些说明。
### Java 版本
您需要 `Java 25` 来编译和运行项目的单元测试,以及 `Java 21` 来运行大多数集成测试。
针对 Guava 项目的 Ruling test 需要 `Java 17`。
请注意,`Java 21` 可用于构建和测试除 `java-checks-test-sources` 下的所有模块(因为它们需要 `Java 25`)。
### 构建项目并运行单元测试
要构建插件并运行其单元测试,请从项目根目录执行此命令:
```
mvn clean install
```
### 注意
在 IDE 中运行单元测试可能会因为项目使用 Maven 构建的方式而遇到一些问题。
如果您看到类似这样的内容:
```
java.lang.SecurityException: class ... signer information does not match signer information of other classes in the same package
```
尝试移除 'jdt' 模块的 Maven 性质。
### 集成测试
要运行集成测试,您需要创建一个如下所示的属性文件,并在名为 `ORCHESTRATOR_CONFIG_URL` 的环境变量中设置指向其位置的 URL。
```
# SonarQube Server 版本
sonar.runtimeVersion=LATEST_RELEASE
orchestrator.updateCenterUrl=http://update.sonarsource.org/update-center-dev.properties
# Maven 本地仓库的位置不会自动猜测。也可以通过 env 变量 MAVEN_LOCAL_REPOSITORY 进行设置。
maven.localRepository=/home/myName/.m2/repository
```
例如,将 `ORCHESTRATOR_CONFIG_URL` 变量设置为:
```
export ORCHESTRATOR_CONFIG_URL=file:///home/user/workspace/orchestrator.properties
```
在运行 ITs 之前,请确保设置了 MAVEN_HOME 环境变量。
#### 健全性测试
“Sanity Test” 是一个针对所有测试源文件运行所有检查的测试,不考虑分析结果。它验证规则不会在我们的测试源文件中的任何文件上崩溃。默认情况下,此测试被排除在构建之外。要启动它:
```
mvn clean install -P sanity
```
#### 插件测试
“Plugin Test” 是一个集成测试套件,用于验证插件功能,如指标计算、覆盖率等。要启动它:
```
mvn clean install -Pit-plugin -DcommunityEditionTestsOnly=true
```
内部贡献者请注意:为了同时执行依赖于 SonarQube Server Enterprise Edition 的测试,请使用:
```
mvn clean install -Pit-plugin
```
#### Ruling 测试
“Ruling Test” 是一个集成测试套件,它启动大型代码库的分析,将插件创建的问题保存在报告文件中,然后将这些结果与预期问题集(存储为 JSON 文件)进行比较。
要运行测试,首先确保子模块已检出:
```
git submodule update --init --recursive
```
然后,确保为 ruling 测试执行设置了 `JAVA_HOME` 环境变量,并且它指向您本地的 JDK 21 安装目录。
未能这样做将导致与预期结果不一致。
从 `its/ruling` 文件夹,启动 ruling 测试:
```
mvn clean install -Pit-ruling -DcommunityEditionTestsOnly=true
# 或者
JAVA_HOME=/my/local/java21/jdk/ mvn clean install -Pit-ruling -DcommunityEditionTestsOnly=true
```
内部贡献者请注意:为了同时执行依赖于 SonarQube Server Enterprise Edition 的测试,请使用:
```
mvn clean install -Pit-ruling
```
此测试使您有机会检查每个规则创建的问题,并确保它们符合您的预期。任何实现的规则极有可能在我们用作 ruling 代码库的多个项目上引发问题。
* 对于新实现的规则,这意味着首次构建很可能会失败,这是由预期结果(新规则没有任何值)与新结果之间的差异引起的。您可以通过在以下文件夹中搜索以您的规则命名的文件(`squid-SXXXX.json`)来检查这些新问题:
/path/to/project/sonar-java/its/ruling/target/actual/...
* 对于已修改的现有规则,您可能会预期“实际”(来自新分析)与预期结果之间存在一些差异。仔细查看显示的更改,并相应地更新预期资源。
所有 `json` 文件包含按文件索引的行列表,解释特定规则引发的问题位于何处。如果/当一切看起来都不错时,您可以将包含实际问题的文件复制到:
```
its/ruling/target/actual/
```
到包含预期问题的目录:
```
its/ruling/src/test/resources/
```
例如使用以下命令:
```
cp its/ruling/target/actual/* its/ruling/src/test/resources/
```
#### Autoscan 测试
[autoscan 模块](its/autoscan)中的测试旨在检测 Java 分析器在有和无字节码情况下可发现的问题之间的差异。
此处的目标是发现并修复潜在的误报,并验证在 [SonarQube Cloud 的自动分析](https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/automatic-analysis/)中会出现的预期漏报。
运行此测试可分解为 2 个步骤:
1. 编译测试源码
2. 执行 autoscan 测试
##### 编译测试源码
确保 `java-checks-test-sources` 模块已编译(即:`java-checks-test-sources/target/` 中的 .class 文件是最新的)。
如有疑问,请转到 [`java-checks-test-sources`](java-checks-tests-sources) 模块并运行:
```
# 使用 Java 25!
mvn clean compile
```
##### 执行 autoscan 测试
要运行测试,请移动到 [`its/autoscan`](its/autoscan) 文件夹并运行:
```
# cd its/autoscan
# 使用 Java 21!
mvn clean package --batch-mode --errors --show-version \
--activate-profiles it-autoscan \
-Dsonar.runtimeVersion=LATEST_RELEASE
```
测试执行期间生成的工件可在 [`its/autoscan/target/actual`](its/autoscan/target/actual) 中找到。
您将需要比较在 autoscan-diff-by-rules 中生成的结果
有关更详细的信息,您可以通过比较两个各自的文件夹来比较有字节码和无字节码发现的结果之间的差异:
* [java-checks-test-sources-mvn](its/autoscan/target/actual/java-checks-test-sources-mvn)
* [java-checks-test-sources-no-binaries](its/autoscan/target/actual/java-checks-test-sources-no-binaries)
根据发现的结果,您可能需要更新基本事实。
预期结果列在 [src/test/resources](its/autoscan/src/test/resources/autoscan/diffs) 中。
#### 调试集成测试
您可以在运行测试时添加 `-Dmaven.binary=mvnDebug` 作为选项来调试 ITs。这将导致分析器 JVM 在继续之前等待调试器附加。
### 更新许可证:
当依赖项发生更改时,使用 `updateLicenses` profile 更新提交的许可证文件:
```
mvn clean package -PupdateLicenses
```
这将根据当前项目依赖项重新生成 `sonar-java-plugin/src/main/resources/licenses/` 中的许可证。
### 许可证
版权所有 2012-2026 SonarSource。
2024 年 11 月 29 日之后发布的 SonarQube 分析器(包括针对早期版本的补丁修复)均依据 [Sonar Source-Available License Version 1 (SSALv1)](LICENSE.txt) 发布。
有关适用于每个文件的许可证的详细信息,请参阅各个文件。
受 SSALv1 约束的文件将在其标头中注明。
标签:Anchore, Bug检测, DevSecOps, JS文件枚举, SAST, SonarQube, SonarSource, URL发现, 上游代理, 云计算, 代码异味, 域名枚举, 域名枚举, 安全专业人员, 安全检测, 开源, 插件, 测试覆盖率, 盲注攻击, 自定义规则, 规则引擎, 认知复杂度, 错误基检测, 静态代码分析