Eclipse 插件与 配置缓存 不兼容。

Eclipse 插件生成 Eclipse IDE 使用的文件,从而可以将项目导入 Eclipse (文件 - 导入…​ - 现有项目到工作区)。

只要将 eclipse 插件应用于 WarEar 项目,就会自动应用 eclipse-wtp。对于实用程序项目(即 Java 项目,由其他 Web 项目使用),您需要显式地应用 eclipse-wtp 插件。

eclipse 插件生成的具体内容取决于使用了哪些其他插件

表 1. Eclipse 插件行为
插件 描述

生成最小的 .project 文件。

Java

将 Java 配置添加到 .project。生成 .classpath 和 JDT 设置文件。

Groovy

将 Groovy 配置添加到 .project 文件。

Scala

.project.classpath 文件中添加 Scala 支持。

战争

.project 文件中添加 Web 应用程序支持。

耳朵

.project 文件中添加 EAR 应用程序支持。

eclipse-wtp 插件生成所有 WTP 设置文件并增强 .project 文件。如果应用了 JavaWar.classpath 将被扩展以获得此实用程序库或 Web 应用程序项目的正确打包结构。

这两个 Eclipse 插件都对自定义开放,并提供一组标准化的钩子,用于向生成的​​文件添加和删除内容。

用法

要使用 Eclipse 或 Eclipse WTP 插件,请在您的构建脚本中包含以下行之一

build.gradle.kts
plugins {
    eclipse
}
build.gradle
plugins {
    id 'eclipse'
}
build.gradle.kts
plugins {
    `eclipse-wtp`
}
build.gradle
plugins {
    id 'eclipse-wtp'
}

注意:在内部,eclipse-wtp 插件也应用了 eclipse 插件,因此您无需同时应用这两个插件。

这两个 Eclipse 插件都向您的项目添加了许多任务。您将使用的主要任务是 eclipsecleanEclipse 任务。

任务

Eclipse 插件将以下所示的任务添加到项目中。

Eclipse 插件任务

eclipse任务

取决于:所有 Eclipse 配置文件生成任务

生成所有 Eclipse 配置文件

cleanEclipse删除

取决于:所有 Eclipse 配置文件清理任务

删除所有 Eclipse 配置文件

cleanEclipseProject删除

删除 .project 文件。

cleanEclipseClasspath删除

删除 .classpath 文件。

cleanEclipseJdt删除

删除 .settings/org.eclipse.jdt.core.prefs 文件。

eclipseProjectGenerateEclipseProject

生成 .project 文件。

eclipseClasspathGenerateEclipseClasspath

生成 .classpath 文件。

eclipseJdtGenerateEclipseJdt

生成 .settings/org.eclipse.jdt.core.prefs 文件。

Eclipse WTP 插件 - 附加任务

cleanEclipseWtpComponentDelete

删除 .settings/org.eclipse.wst.common.component 文件。

cleanEclipseWtpFacetDelete

删除 .settings/org.eclipse.wst.common.project.facet.core.xml 文件。

eclipseWtpComponentGenerateEclipseWtpComponent

生成 .settings/org.eclipse.wst.common.component 文件。

eclipseWtpFacetGenerateEclipseWtpFacet

生成 .settings/org.eclipse.wst.common.project.facet.core.xml 文件。

配置

表 2. Eclipse 插件的配置
模型 引用名称 描述

EclipseModel

eclipse

顶层元素,以 DSL 友好的方式启用 Eclipse 插件的配置。

EclipseProject

eclipse.project

允许配置项目信息

EclipseClasspath

eclipse.classpath

允许配置类路径信息。

EclipseJdt

eclipse.jdt

允许配置 jdt 信息(源/目标 Java 兼容性)。

EclipseWtpComponent

eclipse.wtp.component

仅当应用了 eclipse-wtp 插件时,才允许配置 wtp 组件信息。

EclipseWtpFacet

eclipse.wtp.facet

仅当应用了 eclipse-wtp 插件时,才允许配置 wtp 面信息。

自定义生成的文件

Eclipse 插件允许您自定义生成的元数据文件。这些插件提供了一个 DSL 来配置模型对象,这些模型对象模拟了项目的 Eclipse 视图。然后将这些模型对象与现有的 Eclipse XML 元数据合并,最终生成新的元数据。模型对象提供了更低级别的钩子,用于在与模型配置合并之前和之后处理表示文件内容的域对象。它们还提供了一个非常低级别的钩子,用于在持久化之前直接处理原始 XML 以进行调整,以进行 Eclipse 和 Eclipse WTP 插件未建模的微调和配置。

合并

现有 Eclipse 文件中也是生成内容目标的部分将被修改或覆盖,具体取决于特定部分。其余部分将保持原样。

禁用与完全重写的合并

要完全重写现有的 Eclipse 文件,请执行一个 clean 任务以及其对应的生成任务,例如“gradle cleanEclipse eclipse”(按此顺序)。如果您想将此设置为默认行为,请在您的构建脚本中添加“tasks.eclipse.dependsOn(cleanEclipse)”。这样就不需要显式执行 clean 任务。

此策略也可以用于插件将生成的单个文件。例如,这可以用于“.classpath”文件,使用“gradle cleanEclipseClasspath eclipseClasspath”。

介入生成生命周期

Eclipse 插件提供对象来模拟由 Gradle 生成的 Eclipse 文件的部分。生成生命周期如下

  1. 读取文件;如果文件不存在,则使用 Gradle 提供的默认版本

  2. 使用表示现有文件的域对象执行 beforeMerged 钩子

  3. 将现有内容与从 Gradle 构建推断的配置或在 eclipse DSL 中显式定义的配置合并

  4. 使用表示要持久化的文件内容的域对象执行 whenMerged 钩子

  5. 使用将要持久化的 XML 的原始表示执行 withXml 钩子

  6. 持久化最终的 XML

高级配置钩子

以下列表涵盖了用于每个 Eclipse 模型类型的域对象

EclipseProject
EclipseClasspath
EclipseWtpComponent
EclipseWtpFacet
EclipseJdt
  • beforeMerged { Jdt arg -> …​ }

  • whenMerged { Jdt arg -> …​ }

  • withProperties { arg -> } 参数类型 ⇒ java.util.Properties

部分覆盖现有内容

完全覆盖会导致所有现有内容被丢弃,从而丢失在 IDE 中直接进行的任何更改。 或者,beforeMerged 钩子使您能够仅覆盖现有内容的某些部分。 以下示例从 Classpath 域对象中删除所有现有依赖项

build.gradle.kts
import org.gradle.plugins.ide.eclipse.model.Classpath

eclipse.classpath.file {
    beforeMerged(Action<Classpath> {
        entries.removeAll { entry -> entry.kind == "lib" || entry.kind == "var" }
    })
}
build.gradle
eclipse.classpath.file {
    beforeMerged { classpath ->
        classpath.entries.removeAll { entry -> entry.kind == 'lib' || entry.kind == 'var' }
    }
}

生成的 .classpath 文件将只包含 Gradle 生成的依赖项条目,而不会包含原始文件中可能存在的任何其他依赖项条目。(在依赖项条目情况下,这也是默认行为。).classpath 文件的其他部分将保持原样或合并。 同样的方法也可以用于 .project 文件中的性质

build.gradle.kts
import org.gradle.plugins.ide.eclipse.model.Project

eclipse.project.file.beforeMerged(Action<Project> {
    natures.clear()
})
build.gradle
eclipse.project.file.beforeMerged { project ->
    project.natures.clear()
}

修改完全填充的域对象

whenMerged 钩子允许您操作完全填充的域对象。 通常,这是自定义 Eclipse 文件的首选方法。 以下是如何导出 Eclipse 项目的所有依赖项

build.gradle.kts
import org.gradle.plugins.ide.eclipse.model.AbstractClasspathEntry
import org.gradle.plugins.ide.eclipse.model.Classpath

eclipse.classpath.file {
    whenMerged(Action<Classpath> { ->
        entries.filter { entry -> entry.kind == "lib" }
            .forEach { (it as AbstractClasspathEntry).isExported = false }
    })
}
build.gradle
eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.findAll { entry -> entry.kind == 'lib' }*.exported = false
    }
}

修改 XML 表示

withXml 钩子允许您在将文件写入磁盘之前操作内存中的 XML 表示。 虽然 Groovy 的 XML 支持和 Kotlin 的扩展函数弥补了很多,但这种方法不如操作域对象方便。 作为回报,您可以完全控制生成的 文件,包括域对象未建模的部分。

示例 6. 自定义 XML
build.gradle.kts
import org.w3c.dom.Element

eclipse.wtp.facet.file.withXml(Action<XmlProvider> {
    fun Element.firstElement(predicate: Element.() -> Boolean) =
        childNodes
            .run { (0 until length).map(::item) }
            .filterIsInstance<Element>()
            .first { it.predicate() }

    asElement()
        .firstElement { tagName === "fixed" && getAttribute("facet") == "jst.java" }
        .setAttribute("facet", "jst2.java")
})
build.gradle
eclipse.wtp.facet.file.withXml { provider ->
    provider.asNode().fixed.find { it.@facet == 'jst.java' }.@facet = 'jst2.java'
}

测试类路径条目的分离

Eclipse 仅为每个项目定义一个类路径,这意味着 Gradle 项目的映射方式有限制。 Eclipse 4.8 引入了 测试源 的概念。 此功能允许 Eclipse 插件更好地区分测试源和非测试源。

Eclipse 类路径由以下类路径条目组成:源目录、jar 文件、项目依赖项等。每个类路径条目都可以包含一个类路径属性列表,其中属性是字符串键值对。有两个与测试源相关的类路径属性:testwithout_test_code,它们的值都可以是 truefalse

如果源目录具有 test=true 类路径属性,则其内容被视为测试源。测试源可以访问非测试源,但非测试源无法访问测试源。类似地,测试源只能引用具有 test=true 类路径属性的 jar 文件中的类。对于项目依赖项,如果存在 test=true 属性,则目标项目中的类对测试源可见。如果存在 without_test_code=false 属性,则目标项目的测试源也可访问。默认情况下,测试代码不可用(可以认为隐式地具有 without_test_code=true)。

在生成 Eclipse 类路径时,以下规则适用于测试属性声明

  • 如果源集和依赖项配置的名称包含“test”子字符串(不区分大小写),则将其归类为测试。

  • JVM 测试套件插件定义的所有源集和依赖项配置都归类为测试。

  • 如果容器源集是测试源集,则源目录具有 test=true 类路径属性。

  • 如果 jar 文件和项目依赖项仅存在于测试依赖项配置中,则它们具有 test=true 属性。

  • 如果目标项目应用了 java-test-fixtures 插件,则项目依赖项具有 without_test_sources=false 属性。

您可以自定义测试源集和配置

build.gradle.kts
eclipse {
    classpath {
        testSourceSets = testSourceSets.get() + setOf(integTest)
        testConfigurations = testConfigurations.get() + setOf(functional)
    }
}
build.gradle
eclipse {
    classpath {
        testSourceSets = testSourceSets.get() + [sourceSets.integTest]
        testConfigurations = testConfigurations.get() + [configurations.functional]
    }
}
在类似情况下,请考虑从手动定义额外的测试源集迁移到使用 JVM 测试套件插件

您还可以通过 containsTestFixtures 属性自定义项目是否应将测试源公开给上游项目依赖项。

build.gradle.kts
eclipse {
    classpath {
        containsTestFixtures = true
    }
}
build.gradle
eclipse {
    classpath {
        containsTestFixtures = true
    }
}

请注意,此配置也适用于 Buildship 项目的类路径。