yegor256/qulice
GitHub: yegor256/qulice
Qulice 是一款面向 Java 项目的静态分析聚合工具,将 Checkstyle、PMD 和 ErrorProne 整合为单一 Maven 插件,通过锁定规则集强制执行统一的代码质量标准。
Stars: 321 | Forks: 121
# 集成在一个 Maven 插件中的 Checkstyle 和 PMD
[](https://www.elegantobjects.org)
[](https://www.rultor.com/p/yegor256/qulice)
[](https://www.jetbrains.com/idea/)
[](https://github.com/yegor256/qulice/actions/workflows/mvn.yml)
[](https://www.0pdd.com/p?name=yegor256/qulice)
[](https://maven-badges.herokuapp.com/maven-central/com.qulice/qulice)
[](https://codecov.io/gh/yegor256/qulice)
[](https://hitsofcode.com/view/github/yegor256/qulice)
[](https://github.com/yegor256/qulice/blob/master/LICENSE.txt)
Qulice 是一个针对 Java
项目的静态分析质量控制工具。它结合了所有最好的静态分析工具
并对其进行预配置,包括
[Checkstyle](https://checkstyle.sourceforge.io/)、
[PMD](https://pmd.github.io/) 和
[ErrorProne](https://errorprone.info/)。
您不再需要单独使用和配置它们。
ErrorProne 在由 Qulice 生成的分叉 `javac` 进程中运行,因此您的项目中不需要
额外的 JVM 标志。可以通过 `@SuppressWarnings("CheckName")`(标准的 ErrorProne 机制)
抑制单个检查,或者通过 `errorprone:` 排除项跳过整个路径,例如
`errorprone:.*/generated/.* `。
在 [www.qulice.com](https://www.qulice.com) 阅读更多内容。
此外,请先阅读此博客文章:
[_Strict Control of Java Code Quality_](https://www.yegor256.com/2014/08/13/strict-code-quality-control.html)。
只需将此插件添加到您的 `pom.xml` 中:
```
com.qulice
qulice-maven-plugin
0.27.6
file:${basedir}/LICENSE.txt
check
```
另外请记住,我们支持 Maven 3.1+。
许可证的路径必须以以下格式声明:
`file:${basedir}/LICENSE.txt`,这是默认值,可以使用任何完整路径
代替 `${basedir}`。
请阅读这篇关于您在项目中可能遇到的
[典型错误](https://github.com/yegor256/qulice/wiki/mistakes) 的简短摘要。
为了下载 XML 验证所需的 schema,您可能需要配置代理。
不支持 Maven 代理,但标准的
[JVM 代理](https://docs.oracle.com/javase/8/docs/technotes/guides/net/proxies.html)
可以正常工作。要使用它,只需将 `-Dhttp.proxyHost=HOST -Dhttp.proxyPort=PORT`
添加到您的 `MAVEN_OPTS` 环境变量或 Maven 命令中,例如
`mvn clean verify -Dhttp.proxyHost=HOST -Dhttp.proxyPort=PORT`。
## 架构
Qulice 将 [Checkstyle](https://checkstyle.sourceforge.io/)、
[PMD](https://pmd.github.io/) 和
[ErrorProne](https://errorprone.info/) 聚合在一个单一的
[Maven](https://maven.apache.org/) `verify` 阶段目标 `check` 背后。
与将每个工具作为具有自身配置文件的单独 Maven 插件运行不同,Qulice 不需要在 `pom.xml` 中进行每个工具的设置。
捆绑的规则集是锁定的:所有采用的项目共享相同的
[Checkstyle](https://checkstyle.sourceforge.io/) 和
[PMD](https://pmd.github.io/) 配置。
这与单独使用的 [Spotless](https://github.com/diffplug/spotless)
或 [Checkstyle Maven 插件][csmp] 不同,后两者
都允许按项目自定义规则。
[Checkstyle](https://checkstyle.sourceforge.io/) 配置
(`checks.xml`)和 [PMD](https://pmd.github.io/) 规则集
(`ruleset.xml`)作为 classpath 资源打包在 Qulice JAR 中,
不能被采用的项目覆盖。
项目只能通过 `` 参数抑制特定检查;它们不能添加或重新定义规则。
这是用灵活性换取一致性:代码审查风格期望
在使用 Qulice 的每个存储库中都是完全相同的。
`com.qulice.spi` 包定义了 Maven 和代码检查逻辑之间的扩展边界。
`Environment` 暴露了项目结构(基础目录、classpath、
源文件、排除模式)而不泄露 Maven 内部细节,
使得验证器可以在没有 Maven runtime 的情况下进行单元测试。
`ResourceValidator` 接受一个 `Collection` 并返回
`Collection`;`Validator` 消费完整的 `Environment`,
用于需要更广泛项目上下文的检查。
[Checkstyle](https://checkstyle.sourceforge.io/)、
[PMD](https://pmd.github.io/) 和
[ErrorProne](https://errorprone.info/) 在 `CheckMojo` 的
一个五线程 `ExecutorService` 中并发运行。
每个验证器都作为 `Callable>` 提交,
并通过 `Future` 收集结果。
一个可配置的超时时间(默认十分钟,可通过
`qulice.check-timeout` 覆盖)可防止挂起的验证器无限期地
阻塞构建。
[ErrorProne](https://errorprone.info/) 需要 `--add-exports` 和
`--add-opens` JVM 标志来访问内部 `jdk.compiler` API。
Qulice 没有将这些标志注入到 Maven 自己的 JVM 中(这
将需要每个采用项目都有一个 `.mvn/jvm.config`),
而是通过
[Jaxec](https://github.com/yegor256/jaxec) 派生一个单独的 `javac` 进程。
这些标志仅应用于派生的进程;Maven 的 JVM 保持不变。
在并行代码检查之后,五个特定于 Maven 的验证器按
顺序运行:`PomXpathValidator` 根据用户提供的
[XPath](https://www.w3.org/TR/xpath/) 表达式检查 `pom.xml`;
`EnforcerValidator` 委托给 [maven-enforcer-plugin][mep] 以
验证 JDK 和 Maven 版本;`DependenciesValidator` 使用
[maven-dependency-analyzer][mda] 来查找未使用或未声明的
编译范围依赖;`DuplicateFinderValidator` 检测
跨 classpath JAR 的重复类;以及 `SnapshotsValidator`
拒绝生产构建中的 SNAPSHOT 依赖。
[Checkstyle](https://checkstyle.sourceforge.io/) 和
[PMD](https://pmd.github.io/) 都扩展了自定义规则。
`com.qulice.checkstyle` 包包含大约四十个自定义的
`AbstractCheck` 实现(例如 `ConstructorsOrderCheck`、
`IfThenThrowElseCheck`),涵盖了标准
[Checkstyle](https://checkstyle.sourceforge.io/) 目录中所缺少的约束。
`com.qulice.pmd.rules` 包添加了自定义的 `AbstractJavaRule`
实现(例如 `UnitTestContainsTooManyAssertsRule`、
`ProhibitPlainJunitAssertionsRule`),它们替换了上游
[PMD](https://pmd.github.io/) 规则,这些规则在上游问题追踪器中
已被提交了已知的误报缺陷。
## 如何贡献
派生存储库,进行更改,向我们发送 pull request。我们将审查
您的更改,如果不违反我们的质量标准,我们会将它们
应用到 `master` 分支。为避免受挫,在向我们
发送 pull request 之前,请运行完整的 Maven 构建:
```
mvn clean install -Pqulice
```
请记住,JDK 17+ 和 Maven 3.8+ 是您可以使用的最低版本。
标签:Checkstyle, ErrorProne, JS文件枚举, Maven插件, PMD, SonarQube替代, 代码审查, 代码规范, 域名枚举, 安全专业人员, 实时流处理, 错误基检测, 静态代码分析