将自定义 Eclipse 格式化程序应用于 Gradle 项目

Apply custom Eclipse formatter to Gradle project

我目前正在为一个项目使用 Eclipse Oxygen 和 Gradle 4.4。在 Eclipse 中,可以在工作区或项目上手动设置自定义 Java 格式化程序。这要求团队中的每个人在创建新工作区时都导入格式化程序 XML 文件。为避免队友忘记应用格式化程序并根据约定的样式指南编写代码,我试图在将项目导入 Eclipse 时自动配置 Gradle 项目以使用我们的自定义格式化程序。格式文件位于项目目录中。我还没有找到任何关于如何最好地实现这一目标的可靠信息。我尝试了以下似乎在表面上有效的方法,但似乎会导致 "Faceted Project Problem (Java Version Mismatch: Java compiler level does not match the version of the installed Java project facet." 错误。 sourceCompatibilitytargetCompatibility 在 Gradle 脚本的其他地方设置为 1.8,但编译器合规性级别在项目中设置为 9。如果我不尝试覆盖格式化程序,就不会发生这种情况。当我尝试在“属性”对话框中对项目应用任何更改时,我也会收到一条错误消息:"Error: Exception occurred while saving project preferences: /my-project/.settings/org.eclipse.jdt.ui.prefs."

这是我到目前为止尝试过的方法:

task eclipseConfig {
    group='eclipse'
    dependsOn cleanEclipse
    dependsOn cleanEclipseWtp
    dependsOn tasks['eclipse']
    dependsOn eclipseWtp

    // .settings directory may not exist yet
    file('.settings').mkdir()

    // Attempt to configure Eclipse to use our custom Java formatter
    File f = file('.settings/org.eclipse.jdt.core.prefs')
    f.write('eclipse.preferences.version=1\n')
    def settings = new XmlSlurper().parse(rootProject.file('formatters/eclipse-java-formatter.xml')).profile.setting
    for(def setting : settings) {
        f.append("${setting['@id']}=${setting['@value']}\n")
    }
    f.append('org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter')

    // Another attempt to configure Eclipse to use our custom Java formatter
    f = file('.settings/org.eclipse.jdt.ui.prefs')
    f.write('eclipse.preferences.version=1\n')
    f.append('org.eclipse.jdt.ui.formatterprofiles=')
    f.append(rootProject.file('formatters/eclipse-java-formatter.xml').text
            .replaceAll(~/\r*\n/, '\\r\\n').replaceAll('=', '\\='))
    f.append('\nformatter_profile=_Custom Java Styles')
}

非常感谢任何帮助。

您的方向是正确的:格式化和清理配置保留在 .settings 目录中的 org.eclipse.jdt.core.prefsorg.eclipse.jdt.ui.prefs 文件中。但我不敢逐行弄乱这些文件的内容,因为它们遵循 Eclipse 自己的专有格式,我怀疑这种格式没有得到很好的记录,也不能保证及时保持不变。

相反,我会在 Eclipse 中配置一个虚拟项目的格式和清理,然后将每个文件的完整内容(不是逐行)复制到您的gradle 项目,并在将新项目导出到 Eclipse 时使 gradle 脚本完全粘贴其中的每一个。通过复制和粘贴 Eclipse 创建的完整文件,您将避免像您正在试验的那样的语义错误。

无论如何,如果您仍然想逐行处理这些文件,我认为您当前错误的原因是您忘记了其中一些声明:

  • org.eclipse.jdt.core.prefs: org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
  • org.eclipse.jdt.core.prefs: org.eclipse.jdt.core.compiler.compliance=1.8
  • org.eclipse.jdt.core.prefs: org.eclipse.jdt.core.compiler.source=1.8
  • org.eclipse.wst.common.project.facet.core.xml: <installed facet="java" version="1.8"/>