如何实现一致的java代码格式?

fkaflof6  于 2021-07-06  发布在  Java
关注(0)|答案(5)|浏览(428)

我正在寻找一种方法来强制开发人员使用相同的java代码格式化规则。我的要求是:
梯度积分
检查代码格式是否正确的任务。如果提交了格式不正确的代码,这将用于ci以导致生成失败
修复格式错误代码的任务(很好)
智能集成
通过“重新格式化代码”操作,可以在ide中修复格式错误的代码
ide生成的代码(例如getter/setter生成)符合规则
支持openjdk/oracle java格式化规则
目前我使用spotless的配置如下

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

对于intellij集成,我安装了eclipse代码格式化程序插件,并将其配置为使用与spotless相同的规则。
此方法满足除2.2之外的所有上述要求,即intellij生成的任何代码在符合格式规则之前必须重新格式化。另一个问题是,在重新格式化代码时,导入似乎被任意重新排序。这会产生许多虚假的更改,这使得pull请求更难审查。
有没有其他方法(如checkstyle)不存在这些缺点?

gkn4icbw

gkn4icbw1#

我想你可以用p3c插件

ukqbszuj

ukqbszuj2#

您可以使用googlejava格式,它有用于上述ide(intellij idea,eclipse)的插件,它提供了与maven、gradle或sbt等工具的集成,并提供了将格式化程序作为预提交钩子运行或使用github操作将代码推送到github时运行格式化程序的方法。
在他们的自述中,他们还提到了导入问题以及如何为intellij idea解决这个问题,并提供了更多的见解,例如:如何在spotless gradle插件上处理它,何时使用maven spotless插件,或者github操作。
您的具体案例的一个缺点可能是该工具强制执行googlejava风格指南,正如oraclejava杂志所描述的那样,该指南受到oraclejava团队的赞扬和推荐。它还提供了使用aosp代码样式的选项。
下面是一段关于一尘不染渐变配置的代码片段,考虑到导入顺序:

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
    }
}
jaql4c8m

jaql4c8m3#

我可以帮你。在这里,您主要提出了两个问题:
通过“重新格式化代码”操作,可以在ide中修复格式错误的代码
为此,您需要编写一个代码模板。我们在组织中使用特定的代码模板。现在,您需要在“设置”>“代码样式”下导入此xml代码模板。现在,默认情况下,代码将按照编写模板的方式进行格式化。或者使用ctrl+shift+f作为eclipse快捷方式(在intellij中启用)。对openjdk/oraclejava格式规则的支持可以在同一个模板中处理。请将它们的代码模板作为eclipse中提供的默认模板。
ide生成的代码(例如getter/setter生成)符合规则
这个链接会有帮助。请进一步探讨如何编写自定义代码模板。
为了限制所有开发人员不推送错误格式的代码,您需要编写一个git钩子。它将不允许推送代码,除非代码符合钩子的自定义脚本中提供的基本规则。没有人需要在本地intellij上执行任何操作,git钩子将从远程git repo执行操作。这里有一个支持链接。
我在这里提供了清晰的信息,因为更多的是自定义规则的问题,这些规则将出现在您的代码模板中。
其他问题:检查代码格式是否正确的任务。如果提交的代码格式不正确,这将用于ci以导致生成失败。
当您使用git钩子限制提交的代码时,repo上永远不会有任何未格式化的代码。因此,您不需要将其作为ci构建的一部分。这可以通过提供一个管道脚本来完成,该脚本将触发一个具有代码git位置的方法。在我看来这是件乏味的事。希望你的问题都能回答。

3hvapo4f

3hvapo4f4#

我使用格式化maven插件和导入maven插件
这些插件有validate/check目标,我在ci工具中使用这些目标来验证传入的pr。
它们也有渐变变体。在这里结账

jecbmhm3

jecbmhm35#

checkstyle支持您的大多数需求。

渐变集成:

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自动格式化以使用这些规则。

格式化规则

以下是checkstyle中oracle/sun规范的配置。

相关问题