如何强制实施一致的 Java 代码格式?

2022-09-01 10:04:02

我正在寻找一种方法来强制开发人员使用相同的Java代码格式化规则。我的要求是:

  1. Gradle 集成
    1. 检查代码格式是否正确的任务。这将在 CI 上使用,以便在提交格式不正确的代码时导致生成失败

    2. 修复格式不正确的代码的任务(可有可无)

  2. IntelliJ 集成
    1. 格式不正确的代码可以通过“重新格式化代码”操作在 IDE 中修复
    2. 由 IDE 生成的代码(例如 getter/setter 生成)符合规则
  3. 支持 OpenJDK/Oracle Java 格式化规则

目前,我正在使用以下配置使用Spotless

spotless {
  java {
    toggleOffOn()
    eclipse().configFile("${project.rootDir}/tools/eclipse-java-formatter.xml")
    indentWithSpaces()
    removeUnusedImports()
  }
}

对于IntelliJ集成,我已经安装了Eclipse Code Formatter插件,并将其配置为使用与Spotless相同的规则。

这种方法满足了上述所有要求,除了2.2,即IntelliJ生成的任何代码都必须在符合格式化规则之前重新格式化。另一个问题是,当代码重新格式化时,导入似乎被任意重新排序。这会产生许多虚假的更改,使拉取请求更难以查看。

有没有另一种方法(例如CheckStyle)不会受到这些缺点的影响?


答案 1

您可以使用Google Java Format,它具有用于上述IDE(IntelliJ IDEAEclipse)的插件,它提供了与Maven,Gradle或SBT等工具的集成,并提供了将格式化程序作为预提交钩子运行的方法,或者在使用Github操作将代码推送到Github时

在他们的README中,他们还提到了导入问题以及如何为IntelliJ IDEA修复它,并提供了更多见解,例如:如何在Spotless Gradle插件上处理它,使用Maven Spotless插件时,或者Github操作

您的特定情况的缺点可能是该工具强制执行Google Java风格指南,该指南受到Oracle Java团队的赞扬和推荐,如Oracle Java杂志所述。它还提供了使用 AOSP 代码样式的选项。

下面是一个片段,用于一尘不染的Gradle配置,考虑导入排序:

spotless {
    java {
        importOrder() // standard import order
        importOrder('java', 'javax', 'com.acme', '') // or importOrderFile
        // You probably want an empty string at the end - all of the
        // imports you didn't specify explicitly will go there.

        removeUnusedImports()

        googleJavaFormat() // has its own section below
        eclipse()          // has its own section below
        prettier()         // has its own section below
        clangFormat()      // has its own section below

        licenseHeader '/* (C) $YEAR */' // or licenseHeaderFile
    }
}

答案 2

Checkstyle 支持您的大部分要求。

Gradle 集成:

plugins {
    id 'checkstyle'
}

checkstyle {
    toolVersion = checkstyleVersion
    config = rootProject.resources.text.fromFile(checkstyleRulesRootPath)  # Loads configuration from a file
    ignoreFailures = false # Causes build to fail
    maxWarnings = 0 # Fails even for warnings
}

它不会自动修复代码 (AFAIK)。

IntelliJ 集成:

有一个Checkstyle插件,您可以将其配置为在编码时显示警告。

您还可以配置 IntelliJ 自动格式化以使用这些规则。

格式规则

下面是检查样式中 Oracle/Sun 规范的配置。


推荐