Eclipse 外掛與設定快取不相容。

Eclipse 外掛會產生Eclipse IDE使用的檔案,因此可以將專案匯入 Eclipse(檔案 - 匯入…​ - 現有專案至工作區)。

只要將eclipse外掛套用到WarEar專案,eclipse-wtp就會自動套用。對於公用程式專案(例如其他網路專案使用的Java專案),您需要明確套用eclipse-wtp外掛。

eclipse外掛產生的內容取決於使用哪些其他外掛

表 1. Eclipse 外掛行為
外掛 說明

產生最小的.project檔案。

Java

將 Java 設定新增至.project。產生.classpath和 JDT 設定檔案。

Groovy

將 Groovy 設定新增至.project檔案。

Scala

將 Scala 支援新增至.project.classpath檔案。

War

將網頁應用程式支援新增至.project檔案。

Ear

將 ear 應用程式支援新增至.project檔案。

eclipse-wtp外掛會產生所有 WTP 設定檔案,並加強.project檔案。如果套用JavaWar.classpath會延伸,以取得此公用程式函式庫或網頁應用程式專案的適當封裝結構。

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 檔案。

eclipseProject產生 Eclipse 專案

產生 .project 檔案。

eclipseClasspath產生 Eclipse 類別路徑

產生 .classpath 檔案。

eclipseJdt產生 Eclipse Jdt

產生 .settings/org.eclipse.jdt.core.prefs 檔案。

Eclipse WTP 外掛程式 — 其他工作

cleanEclipseWtpComponent刪除

移除 .settings/org.eclipse.wst.common.component 檔案。

cleanEclipseWtpFacet刪除

移除 .settings/org.eclipse.wst.common.project.facet.core.xml 檔案。

eclipseWtpComponent產生 Eclipse Wtp 元件

產生 .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 檔案,請執行清除工作,並搭配對應的產生工作,例如「gradle cleanEclipse eclipse」(依此順序)。如果您想將此設定為預設行為,請將「tasks.eclipse.dependsOn(cleanEclipse)」新增至您的建置指令碼。這樣就不需要明確執行清除工作。

此策略也可套用於外掛程式會產生的個別檔案。例如,這可以用於「.classpath」檔案,執行「gradle cleanEclipseClasspath eclipseClasspath」。

連結至產生生命週期

Eclipse 外掛程式提供建模物件,用於建構由 Gradle 產生的 Eclipse 檔案區段。產生生命週期如下

  1. 讀取檔案;或如果檔案不存在,則使用 Gradle 提供的預設版本

  2. beforeMerged 連結會執行,並附上代表現有檔案的網域名稱物件

  3. 現有內容會與從 Gradle 建置推論出的組態合併,或在 eclipse DSL 中明確定義

  4. whenMerged 連結會執行,並附上代表要保留的檔案內容的網域名稱物件

  5. withXml 連結會執行,並附上將要保留的 XML 原始表示

  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 類別路徑屬性,則內容會被視為測試來源。測試來源可以存取非測試來源,但非測試來源無法存取測試來源。類似地,測試來源只能參考 jar 檔案中的類別,如果 jar 檔案具有 test=true 類別路徑屬性。對於專案相依性,如果存在 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 專案的類別路徑。