【问题标题】:How can a consistent Java code format be enforced?如何强制执行一致的 Java 代码格式?
【发布时间】:2021-03-03 17:59:07
【问题描述】:

我正在寻找一种方法来强制开发人员使用相同的 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 pluginconfigured it 以使用与 Spotless 相同的规则。

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

是否有其他方法(例如 CheckStyle)不存在这些缺点?

【问题讨论】:

  • 对于Intellij,有一个Save Actions 插件可以组织导入并在保存文件时强制执行代码格式。这会有帮助吗?
  • @Eugene 不是真的
  • 在 IntelliJ 中,您可以将所有规则作为首选项导出到文件中,并要求团队在设置开发环境之前导入这些首选项。这将确保每个人都遵循相同的格式化规则,并且 IntelliJ 也会格式化自动生成的代码。如果有人无法导入 IntelliJ 首选项,您可以使用 Gradle 一尘不染的插件来处理这种情况。如果这可行,我可以详细说明您在此问题中提到的其他问题的解决方案。
  • 您能详细说明原因吗?您可以在 intellij 中导入相同的规则,并通过 Save Actions 进行相同的导入。
  • 保存操作建议解决了您的 2.2。并且可以与 Intellij 格式化规则一起使用,所以既然你声称你现有的解决方案只违反了 2.2.,那又是什么问题呢?

标签: java gradle intellij-idea


【解决方案1】:

您可以使用Google Java Format,它具有上述 IDE 的插件(IntelliJ IDEAEclipse),它提供与 Maven、Gradle 或 SBT 等工具的集成,并提供将格式化程序运行为pre-commit hookwhen pushing the code to Github with Github actions

在他们的自述文件中,他们还提到了导入问题以及如何为 IntelliJ IDEA 修复它,并提供了更多见解,例如:关于如何在 Spotless Gradle plugin、使用 Maven Spotless pluginGithub actions 时处理它.

针对您的特定情况的一个缺点可能是该工具强制执行Google Java style guide,即was praised and recommended by the Oracle Java team as described in the Oracle Java magazine。它还提供了使用AOSP code style 的选项。

低于spotless Gradle 配置的 sn-p,考虑导入排序:

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】:

    我可以在这里为您提供帮助。主要是,您在这里提出了两个主要问题:

    可以通过“重新格式化代码”操作在 IDE 中修复格式不正确的代码

    为此,您需要编写代码模板。我们在组织中使用特定的代码模板。现在,您需要在 Settings > Code Style 下导入此 XML 代码模板。 现在,默认情况下,代码将按照模板的编写方式进行格式化。 或者使用 Ctrl +Shift+ F 作为 eclipse 快捷方式(在 intelliJ 中启用)。 可以在同一个模板中处理对 OpenJDK/Oracle Java 格式规则的支持。请参考他们的代码模板作为 Eclipse 中提供的默认模板。

    IDE 生成的代码(例如 getter/setter 生成)符合规则

    这个link 会有所帮助。请进一步了解如何编写自定义代码模板。

    为了限制所有开发者不要推送错误格式的代码,你需要编写一个GIT hook。除非代码符合钩子自定义脚本中提供的基本规则,否则不允许推送代码。没有人需要在本地 intelliJ 上做任何事情,git 钩子将从远程 GIT 存储库中执行。这是支持link的一个。

    我在这里提供了清晰的信息,因为更多的是自定义规则将出现在您的代码模板中。

    其他问题: 检查代码格式是否正确的任务。如果提交格式不正确的代码,这将用于 CI 导致构建失败。

    当您将使用 git 挂钩限制提交的代码时,将永远不会有任何未格式化的代码在 repo 上。因此,您不需要它作为 CI 构建的一部分。 这可以通过提供一个管道脚本来完成,该脚本将触发一个具有您代码的 git 位置的方法。在我看来这是一件乏味的事情。 希望您的所有问题都得到解答。

    【讨论】:

      【解决方案3】:

      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 plugin 可以配置为在编码时显示警告。

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

      格式化规则

      Here是checkstyle中Oracle/Sun规范的配置。

      【讨论】:

        【解决方案4】:

        我使用formatter-maven-pluginimport-maven-plugin

        这些插件具有验证/检查目标,我在 CI 工具中使用这些目标来验证传入的 PR。

        它们也有 gradle 变体。结帐here

        【讨论】:

          【解决方案5】:

          我觉得你可以用p3c plugin

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-03-25
            • 2019-08-11
            • 1970-01-01
            • 1970-01-01
            • 2014-06-04
            • 2011-04-02
            • 1970-01-01
            相关资源
            最近更新 更多