Eclipse 插件与 配置缓存 不兼容。 |
Eclipse 插件生成 Eclipse IDE 使用的文件,从而可以将项目导入 Eclipse (文件
- 导入…
- 现有项目到工作区
)。
只要将 eclipse
插件应用于 War 或 Ear 项目,就会自动应用 eclipse-wtp
。对于实用程序项目(即 Java 项目,由其他 Web 项目使用),您需要显式地应用 eclipse-wtp
插件。
eclipse
插件生成的具体内容取决于使用了哪些其他插件
插件 | 描述 |
---|---|
无 |
生成最小的 |
将 Java 配置添加到 |
|
将 Groovy 配置添加到 |
|
在 |
|
在 |
|
在 |
eclipse-wtp
插件生成所有 WTP 设置文件并增强 .project
文件。如果应用了 Java 或 War,.classpath
将被扩展以获得此实用程序库或 Web 应用程序项目的正确打包结构。
这两个 Eclipse 插件都对自定义开放,并提供一组标准化的钩子,用于向生成的文件添加和删除内容。
用法
要使用 Eclipse 或 Eclipse WTP 插件,请在您的构建脚本中包含以下行之一
plugins {
eclipse
}
plugins {
id 'eclipse'
}
plugins {
`eclipse-wtp`
}
plugins {
id 'eclipse-wtp'
}
注意:在内部,eclipse-wtp
插件也应用了 eclipse
插件,因此您无需同时应用这两个插件。
这两个 Eclipse 插件都向您的项目添加了许多任务。您将使用的主要任务是 eclipse
和 cleanEclipse
任务。
任务
Eclipse 插件将以下所示的任务添加到项目中。
Eclipse 插件任务
eclipse
— 任务-
取决于:所有 Eclipse 配置文件生成任务
生成所有 Eclipse 配置文件
cleanEclipse
— 删除-
取决于:所有 Eclipse 配置文件清理任务
删除所有 Eclipse 配置文件
cleanEclipseProject
— 删除-
删除
.project
文件。 cleanEclipseClasspath
— 删除-
删除
.classpath
文件。 cleanEclipseJdt
— 删除-
删除
.settings/org.eclipse.jdt.core.prefs
文件。 eclipseProject
— GenerateEclipseProject-
生成
.project
文件。 eclipseClasspath
— GenerateEclipseClasspath-
生成
.classpath
文件。 eclipseJdt
— GenerateEclipseJdt-
生成
.settings/org.eclipse.jdt.core.prefs
文件。
Eclipse WTP 插件 - 附加任务
cleanEclipseWtpComponent
— Delete-
删除
.settings/org.eclipse.wst.common.component
文件。 cleanEclipseWtpFacet
— Delete-
删除
.settings/org.eclipse.wst.common.project.facet.core.xml
文件。 eclipseWtpComponent
— GenerateEclipseWtpComponent-
生成
.settings/org.eclipse.wst.common.component
文件。 eclipseWtpFacet
— GenerateEclipseWtpFacet-
生成
.settings/org.eclipse.wst.common.project.facet.core.xml
文件。
配置
模型 | 引用名称 | 描述 |
---|---|---|
|
顶层元素,以 DSL 友好的方式启用 Eclipse 插件的配置。 |
|
|
允许配置项目信息 |
|
|
允许配置类路径信息。 |
|
|
允许配置 jdt 信息(源/目标 Java 兼容性)。 |
|
|
仅当应用了 |
|
|
仅当应用了 |
自定义生成的文件
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 文件的部分。生成生命周期如下
-
读取文件;如果文件不存在,则使用 Gradle 提供的默认版本
-
使用表示现有文件的域对象执行
beforeMerged
钩子 -
将现有内容与从 Gradle 构建推断的配置或在 eclipse DSL 中显式定义的配置合并
-
使用表示要持久化的文件内容的域对象执行
whenMerged
钩子 -
使用将要持久化的 XML 的原始表示执行
withXml
钩子 -
持久化最终的 XML
高级配置钩子
以下列表涵盖了用于每个 Eclipse 模型类型的域对象
- EclipseProject
-
-
beforeMerged { Project arg -> … }
-
whenMerged { Project arg -> … }
-
withXml { XmlProvider arg -> … }
-
- EclipseClasspath
-
-
beforeMerged { Classpath arg -> … }
-
whenMerged { Classpath arg -> … }
-
withXml { XmlProvider arg -> … }
-
- EclipseWtpComponent
-
-
beforeMerged { WtpComponent arg -> … }
-
whenMerged { WtpComponent arg -> … }
-
withXml { XmlProvider arg -> … }
-
- EclipseWtpFacet
-
-
beforeMerged { WtpFacet arg -> … }
-
whenMerged { WtpFacet arg -> … }
-
withXml { XmlProvider arg -> … }
-
- EclipseJdt
-
-
beforeMerged { Jdt arg -> … }
-
whenMerged { Jdt arg -> … }
-
withProperties { arg -> }
参数类型 ⇒java.util.Properties
-
部分覆盖现有内容
完全覆盖会导致所有现有内容被丢弃,从而丢失在 IDE 中直接进行的任何更改。 或者,beforeMerged
钩子使您能够仅覆盖现有内容的某些部分。 以下示例从 Classpath
域对象中删除所有现有依赖项
import org.gradle.plugins.ide.eclipse.model.Classpath
eclipse.classpath.file {
beforeMerged(Action<Classpath> {
entries.removeAll { entry -> entry.kind == "lib" || entry.kind == "var" }
})
}
eclipse.classpath.file {
beforeMerged { classpath ->
classpath.entries.removeAll { entry -> entry.kind == 'lib' || entry.kind == 'var' }
}
}
生成的 .classpath
文件将只包含 Gradle 生成的依赖项条目,而不会包含原始文件中可能存在的任何其他依赖项条目。(在依赖项条目情况下,这也是默认行为。).classpath
文件的其他部分将保持原样或合并。 同样的方法也可以用于 .project
文件中的性质
import org.gradle.plugins.ide.eclipse.model.Project
eclipse.project.file.beforeMerged(Action<Project> {
natures.clear()
})
eclipse.project.file.beforeMerged { project ->
project.natures.clear()
}
修改完全填充的域对象
whenMerged
钩子允许您操作完全填充的域对象。 通常,这是自定义 Eclipse 文件的首选方法。 以下是如何导出 Eclipse 项目的所有依赖项
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 }
})
}
eclipse.classpath.file {
whenMerged { classpath ->
classpath.entries.findAll { entry -> entry.kind == 'lib' }*.exported = false
}
}
修改 XML 表示
withXml
钩子允许您在将文件写入磁盘之前操作内存中的 XML 表示。 虽然 Groovy 的 XML 支持和 Kotlin 的扩展函数弥补了很多,但这种方法不如操作域对象方便。 作为回报,您可以完全控制生成的 文件,包括域对象未建模的部分。
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")
})
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 文件、项目依赖项等。每个类路径条目都可以包含一个类路径属性列表,其中属性是字符串键值对。有两个与测试源相关的类路径属性:test
和 without_test_code
,它们的值都可以是 true
或 false
。
如果源目录具有 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
属性。
您可以自定义测试源集和配置
eclipse {
classpath {
testSourceSets = testSourceSets.get() + setOf(integTest)
testConfigurations = testConfigurations.get() + setOf(functional)
}
}
eclipse {
classpath {
testSourceSets = testSourceSets.get() + [sourceSets.integTest]
testConfigurations = testConfigurations.get() + [configurations.functional]
}
}
在类似情况下,请考虑从手动定义额外的测试源集迁移到使用 JVM 测试套件插件。 |
您还可以通过 containsTestFixtures
属性自定义项目是否应将测试源公开给上游项目依赖项。
eclipse {
classpath {
containsTestFixtures = true
}
}
eclipse {
classpath {
containsTestFixtures = true
}
}
请注意,此配置也适用于 Buildship 项目的类路径。