第38章 Eclipse プラグイン

The Eclipse plugin generates files that are used by the Eclipse IDE, thus making it possible to import the project into Eclipse (File - Import... - Existing Projects into Workspace). Both external dependencies (including associated source and Javadoc files) and project dependencies are considered.

Eclipse プラグインは Eclipse IDE が利用するファイルを生成し、 (ファイル - インポート... - 既存プロジェクトをワークスペースへ で) Eclipse 内にプロジェクトをインポートできるようにします。 外部依存関係 (ソースと Javadoc も含む) とプロジェクト依存関係の両方が考慮されます。

Since version 1.0-milestone-4 of Gradle, the WTP-generating code was refactored into a separate plugin called eclipse-wtp. So if you are interested in WTP integration then only apply the eclipse-wtp plugin. Otherwise applying the eclipse plugin is enough. This change was requested by Eclipse users who take advantage of the war or ear plugins, but who don't use Eclipse WTP. Internally, the eclipse-wtp plugin also applies the eclipse plugin so you don't need to apply both of those plugins.

1.0-milestone-4 以降、WTP生成コードはリファクタリングされ、eclipse-wtp プラグインに分離されました。 もしWTP が必要であれば、eclipse-wtp プラグインを適用するだけです。必要でなければ、eclipse プラグインを適用するだけでよいです。 この変更は WTP を利用せずに war プラグインや ear プラグインだけを利用するという Eclipse ユーザの要望によるものです。 eclipse-wtp プラグインは 内部的に eclipse プラグインも適用するので 両方を適用する必要はありません。

What exactly the Eclipse plugin generates depends on which other plugins are used:

Eclipse プラグインが何を生成するかは どのプラグインと一緒に利用するかで決まります。

表38.1 Eclipse プラグインの振舞いEclipse plugin behavior

プラグインPlugin説明Description
なしNone最小構成の .project ファイルを生成します。 Generates minimal .project file.
JavaJava の構成を .project ファイルに追加します。 .classpath ファイルと JDT 設定ファイルを生成します。 Adds Java configuration to .project. Generates .classpath and JDT settings file.
GroovyGroovy の構成を.project ファイルに追加します。 Adds Groovy configuration to .project file.
ScalaAdds Scala support to .project and .classpath files.
WarWEBアプリケーションのサポートを.projectファイルと.classpathファイルに追加します。 eclipse-wtp プラグインを適用している場合のみ WTP 設定ファイルを生成します。 Adds web application support to .project file. Generates WTP settings files only if eclipse-wtp plugin was applied.
Ear EAR アプリケーションのサポートを .project ファイルに追加します。 eclipse-wtp プラグインを適用している場合のみ WTP 設定ファイルを生成します。 Adds ear application support to .project file. Generates WTP settings files only if eclipse-wtp plugin was applied.

The Eclipse plugin is open to customization and provides a standardized set of hooks for adding and removing content from the generated files.

Eclipseプラグインは、カスタマイズが容易なように作られています。 生成されたファイルに内容を追加したり削除したりするための、標準化されたフックが用意されています。

38.1. 使用方法Usage

To use the Eclipse plugin, include this in your build script:

Eclipseプラグインを使う為には、ビルドスクリプトに下記を含めます:

例38.1 Eclipseプラグインの使用方法

build.gradle

apply plugin: 'eclipse'

The Eclipse plugin adds a number of tasks to your projects. The main tasks that you will use are the eclipse and cleanEclipse tasks.

Eclipseプラグインは多くのタスクをプロジェクトに追加しますが、主に利用するのは eclipsecleanEclipse タスクだけです。

38.2. タスクTasks

The Eclipse plugin adds the tasks shown below to a project.

Eclipseプラグインはプロジェクトに以下のタスクを追加します。

表38.2 Eclipse プラグイン - タスクEclipse plugin - tasks

タスク名Task name 依存先Depends on Type 説明Description
eclipse eclipseProject, eclipseClasspath, eclipseJdt, eclipseWtpComponent, cleanEclipseWtpFacet Task Eclipseの全ての設定ファイルを生成します。 Generates all Eclipse configuration files
cleanEclipse cleanEclipseProject, cleanEclipseClasspath, cleanEclipseJdt, cleanEclipseWtpComponent, cleanEclipseWtpFacet Delete Eclipseの全ての設定ファイルを削除します。 Removes all Eclipse configuration files
cleanEclipseProject - Delete .projectファイルを生成します。 Generates the .project file.
cleanEclipseClasspath - Delete .classpathファイルを生成します。 Generates the .classpath file.
cleanEclipseJdt - Delete .settings/org.eclipse.jdt.core.prefsファイルを削除します。 Removes the .settings/org.eclipse.jdt.core.prefs file.
cleanEclipseWtpComponent - Delete .settings/org.eclipse.wst.common.componentファイルを削除します。 Removes the .settings/org.eclipse.wst.common.component file.
cleanEclipseWtpFacet - Delete .settings/org.eclipse.wst.common.componentファイルを削除します。 Removes the .settings/org.eclipse.wst.common.component file.
eclipseProject - GenerateEclipseProject .projectファイルを生成します。 Generates the .project file.
eclipseClasspath - GenerateEclipseClasspath .classpathファイルを生成します。 Generates the .classpath file.
eclipseJdt - GenerateEclipseJdt .settings/org.eclipse.jdt.core.prefsファイルを生成します。 Generates the .settings/org.eclipse.jdt.core.prefs file.
eclipseWtpComponent - GenerateEclipseWtpComponent eclipse-wtpが適用されている場合のみ .settings/org.eclipse.wst.common.componentファイルを生成します。 Generates the .settings/org.eclipse.wst.common.component file only if eclipse-wtp plugin was applied.
eclipseWtpFacet - GenerateEclipseWtpFacet eclipse-wtpが適用されている場合のみ .settings/org.eclipse.wst.common.project.facet.core.xmlファイルを生成します。 Generates the .settings/org.eclipse.wst.common.project.facet.core.xml file only if eclipse-wtp plugin was applied.

38.3. 設定Configuration

表38.3 Eclipseプラグインの設定 Configuration of the Eclipse plugin

モデルModel 参照名Reference name 説明Description
EclipseModel eclipse DSLにあったやり方でEclipseプラグインの設定が可能なトップレベル要素 Top level element that enables configuration of the Eclipse plugin in a DSL-friendly fashion
EclipseProject eclipse.project プロジェクトの情報を設定できます。 Allows configuring project information
EclipseClasspath eclipse.classpath クラスパスの情報を設定できます。 Allows configuring classpath information
EclipseJdt eclipse.jdt JDT の情報を設定できます。(source/target java互換) Allows configuring jdt information (source/target Java compatibility)
EclipseWtpComponent eclipse.wtp.component eclipse-wtpプラグインを適用した場合のみ、WTPコンポーネントの情報を設定できます。 Allows configuring wtp component information only if eclipse-wtp plugin was applied.
EclipseWtpFacet eclipse.wtp.facet eclipse-wtpプラグインを適用した場合のみ、WTPファセットの情報を設定できます。 Allows configuring wtp facet information only if eclipse-wtp plugin was applied.

38.4. 生成されたファイルをカスタマイズするCustomizing the generated files

The Eclipse plugin allows you to customize the generated metadata files. The plugin provides a DSL for configuring model objects that model the Eclipse view of the project. These model objects are then merged with the existing Eclipse XML metadata to ultimately generate new metadata. The model objects provide lower level hooks for working with domain objects representing the file content before and after merging with the model configuration. They also provide a very low level hook for working directly with the raw XML for adjustment before it is persisted, for fine tuning and configuration that the Eclipse plugin does not model.

Eclipseプラグインは、生成されるメタデータファイルをカスタマイズできるようになっています。 このプラグインでは、DSLを使ってモデルオブジェクトの設定を行うことができます。このモデルオブジェクトは、Eclipseのプロジェクトを表すものです。 DSLで設定したEclipseのモデルオブジェクトは、既存のXMLメタデータとマージされ、最終的な新しいメタデータが生成されます。 メタデータの内容は、ドメインオブジェクトという形で表現されます。マージ前後にそのドメインオブジェクトを操作する、低レベルなフックも用意されています。 また、さらに低レベルなフックも用意されており、メタデータをファイルに保存する前に、生のXMLデータを直接取り扱うこともできます。 そのフックを使えば、プラグインがモデル化していない設定要素を微調整したり編集したりすることも可能です。

38.4.1. マージするMerging

Sections of existing Eclipse files that are also the target of generated content will be amended or overwritten, depending on the particular section. The remaining sections will be left as-is.

既存のEclipseファイルの、対象のセクションだけを生成された内容で変更、もしくは上書きし、それ以外はそのまま残します。

38.4.1.1. マージせずに完全に上書きするDisabling merging with a rewrite

To completely rewrite existing Eclipse files, execute a clean task together with its corresponding generation task, like “gradle cleanEclipse eclipse” (in that order). If you want to make this the default behavior, add “tasks.eclipse.dependsOn(cleanEclipse)” to your build script. This makes it unnecessary to execute the clean task explicitly.

既存の Eclipse ファイルを完全に上書きしたい場合は、対応する生成タスクと一緒に clean タスクも実行します。 例えば gradle cleanEclipse eclipse のように... (もちろん この順番で...) もし、この動きをデフォルトにしたい場合は、ビルドスクリプトに eclipse.dependsOn(cleanEclipse) を追加します。 そうすれば 明示的に clean タスクを実行する必要はありません。

This strategy can also be used for individual files that the plugin would generate. For instance, this can be done for the “.classpath” file with “gradle cleanEclipseClasspath eclipseClasspath”.

Complete overwrite works equally well for individual files, for example by executing gradle cleanEclipseClasspath eclipseClasspath.

個々のファイルについても同じように完全に上書きすることができます。例えば、 gradle cleanEclipseClasspath eclipseClasspath のように...

38.4.2. 生成ライフサイクルにフックするHooking into the generation lifecycle

The Eclipse plugin provides objects modeling the sections of the Eclipse files that are generated by Gradle. The generation lifecycle is as follows: Eclipse プラグインは Gradle が生成する Eclipse ファイルのセクションをモデリングしたドメインクラスを提供します。 生成ライフサイクルは次の通りです。

  1. The file is read; or a default version provided by Gradle is used if it does not exist ファイルが読み込まれる。ファイルが存在しない場合は、Gradleがデフォルトの内容を用意する。
  2. The beforeMerged hook is executed with a domain object representing the existing filebeforeMergedフックが実行され、既存の設定内容を表すドメインオブジェクトがフックに引き渡される。
  3. The existing content is merged with the configuration inferred from the Gradle build or defined explicitly in the eclipse DSL Gradleのビルド内容から推測される、またはEclipse DSLで明示された設定内容と、既存の設定内容がマージされる。
  4. The whenMerged hook is executed with a domain object representing contents of the file to be persistedwhenMergedフックが実行され、保存される予定の設定内容を表すドメインオブジェクトがフックに引き渡される。
  5. The withXml hook is executed with a raw representation of the XML that will be persistedwithXmlフックが実行され、保存される予定の生XMLがフックに引き渡される。
  6. The final XML is persisted 最終的なXMLが保存される。

The following table lists the domain object used for each of the Eclipse model types: 以下は Eclipseモデルの型毎の利用ドメインオブジェクトの一覧表です。

表38.4 高度な構成フックAdvanced configuration hooks

モデルModel beforeMerged { arg -> } 引数型argument type whenMerged { arg -> } 引数型argument type withXml { arg -> } 引数型argument type
EclipseProject Project Project XmlProvider
EclipseClasspath Classpath Classpath XmlProvider
EclipseJdt Jdt Jdt
EclipseWtpComponent WtpComponent WtpComponent XmlProvider
EclipseWtpFacet WtpFacet WtpFacet XmlProvider

38.4.2.1. 既存の内容の一部を上書きする Partial overwrite of existing content

A complete overwrite causes all existing content to be discarded, thereby losing any changes made directly in the IDE. Alternatively, the beforeMerged hook makes it possible to overwrite just certain parts of the existing content. The following example removes all existing dependencies from the Classpath domain object: 完全に上書きしてしまうと 既存の内容を全て破棄してしまいます。 それにより IDE で直接変更した内容が消されてしまいます。beforeMerged フックを使えば 既存の内容の一部だけを上書きすることができます。 次の例は 存在する全ての依存関係を classpath ドメインオブジェクトから削除します。

例38.2 classpath の一部を上書き

build.gradle

eclipse.classpath.file {
    beforeMerged { classpath ->
        classpath.entries.removeAll { entry -> entry.kind == 'lib' || entry.kind == 'var' }
    }
}


The resulting .classpath file will only contain Gradle-generated dependency entries, but not any other dependency entries that may have been present in the original file. (In the case of dependency entries, this is also the default behavior.) Other sections of the .classpath file will be either left as-is or merged. The same could be done for the natures in the .project file: この例で生成された .classpath ファイルには Gradleによって生成された依存関係のエントリしか含みません。 元のファイルにあった他の依存関係のエントリは全く含みません。(依存関係のエントリの場合はこれがデフォルトの振る舞いです。) .classpathファイルの他のセクションは そのまま残るかマージされるでしょう。 .project ファイルの ネーチャーでも同様です。

例38.3 project の一部を上書き

build.gradle

eclipse.project.file.beforeMerged { project ->
    project.natures.clear()
}


38.4.2.2. 完全に populate されたドメインオブジェクトを変更するModifying the fully populated domain objects

The whenMerged hook allows to manipulate the fully populated domain objects. Often this is the preferred way to customize Eclipse files. Here is how you would export all the dependencies of an Eclipse project:

例38.4 依存関係のエクスポート

build.gradle

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.findAll { entry -> entry.kind == 'lib' }*.exported = false
    }
}


whenMergedフックは完全にデータが設定されたドメインオブジェクトを操作することができます。 これは Eclipse のファイルをカスタマイズするのにはよい方法です。 以下は Eclipse プロジェクトの全ての依存関係をエクスポートする方法です:

例38.5 依存関係のエクスポート

build.gradle

eclipse.classpath.file {
    whenMerged { classpath ->
        classpath.entries.findAll { entry -> entry.kind == 'lib' }*.exported = false
    }
}


38.4.2.3. XML表現を変更するModifying the XML representation

The withXmlhook allows to manipulate the in-memory XML representation just before the file gets written to disk. Although Groovy's XML support makes up for a lot, this approach is less convenient than manipulating the domain objects. In return, you get total control over the generated file, including sections not modeled by the domain objects.

例38.6 XML のカスタマイズ

build.gradle

apply plugin: 'eclipse-wtp'

eclipse.wtp.facet.file.withXml { provider ->
    provider.asNode().fixed.find { it.@facet == 'jst.java' }.@facet = 'jst2.java'
}


withXmlフックはディスクに書き出される直前のメモリ内の XML 表現を操作することができます。 ただ、Groovy の XML サポートがいろいろと補ってくれたとしても、このアプローチはドメインオブジェクトを操作するほど便利ではありません。 その代わりに、生成されたファイルを通して全ての操作が可能です。もちろん、ドメインオブジェクトにモデル化されなかったセクションも含みます。

例38.7 XML のカスタマイズCustomizing the XML

build.gradle

apply plugin: 'eclipse-wtp'

eclipse.wtp.facet.file.withXml { provider ->
    provider.asNode().fixed.find { it.@facet == 'jst.java' }.@facet = 'jst2.java'
}