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

时间:2018-02-06 00:14:53

标签: eclipse gradle eclipse-jdt gradle-eclipse

我目前正在使用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."错误。在Gradle脚本的其他地方sourceCompatibilitytargetCompatibility设置为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')
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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

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

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

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