プロジェクト・ネーチャー

org.eclipse.core.resources.natures

ワークスペースでは、プロジェクト・ネーチャー (または「ネーチャー」と略します) の概念がサポートされています。ネーチャーは、プロジェクトにライフ・サイクル動作を関連付けます。ネーチャーは、 org.eclipse.core.resources.IProject に定義されている setDescription メソッドを使用して、プロジェクトごとにインストールされます。プロジェクトに追加されるときに構成され、プロジェクトから除去されるときに構成解除されます。例えば、Java ネーチャーは Java ビルダーをインストールし、プロジェクトに追加されるときにその他のプロジェクト構成を行います。

ネーチャーの作成者は、ネーチャー拡張ポイントを使用することにより、そのネーチャーの実装をシンボリック名に登録することができます。これはワークスペース内からネーチャーの検出および構成に使用されます。シンボル名はネーチャー拡張機能の ID です。ネーチャー拡張機能を定義する場合は、"name" 属性にわかりやすい値を指定するようにしてください。この名前から機能の意味が特定されます。また、ユーザーに表示される可能性もあります。

ネーチャーは、その他のネーチャーとの関係制約を指定できます。 "one-of-nature" 制約は指定したセットに属すネーチャーが常にプロジェクトで 2 つ以上にならないように指定します。これで、相互に互換性のないネーチャー間の相互排他が強制されます。 "requires-nature" 制約は、別のネーチャーとの依存関係を指定します。ネーチャーをプロジェクトに追加するときは、必要なすべてのネーチャーも追加する必要があります。ネーチャーは常に、必要なネーチャーが先に構成され、後で構成解除されることが保証されています。この理由から、ネーチャー間の循環依存関係は許可されていません。

変更によって、以前は満たされていた制約が満たされなくなる場合、ネーチャーをプロジェクトに追加、またはプロジェクトから除去することはできません。ネーチャーがプロジェクト上で構成されたが、後からその制約が満たされていないことが分かると、そのネーチャーとそのネーチャーを必要とするすべてのネーチャーに使用不可 のマークが付けられますが、プロジェクト上には残されます。これは、例えば必要なネーチャーがインストールから欠落したときなどに発生することがあります。インストールから欠落するネーチャー、また依存関係サイクルに関係するネーチャーにも使用不可のマークが付けられます。

さらにネーチャーは、インクリメンタル・プロジェクト・ビルダーが存在する場合に、それを構成するように指定できます。この情報を使用して、ワークスペースは、ビルダーに対応するネーチャーが存在し、ビルドしているプロジェクト上で使用可能になっているときにのみ、ビルダーが実行されるようにします。ネーチャーはプロジェクトから除去されたが、ネーチャーの構成解除メソッドがそれに対応するビルダーの除去に失敗した場合は、ワークスペースがビルド・スペックからそれらのビルダーを自動的に除去します。 2 つのネーチャーが、それらのマークアップ内に同じインクリメンタル・プロジェクト・ビルダーを指定することは許可されていません。

また、ネーチャーには、ネーチャーが関連付けられているプロジェクトで、リンクされたリソースの作成を拒否する機能があります。 allowLinking 属性を「false」に設定することによって、ネーチャーは、リンクされたリソースが作成されないことを宣言できます。これは、リリース 2.1 の新しいフィーチャーです。

リリース 3.1 以降、ネーチャーは任意のコンテンツ・タイプとの親和性を宣言することができます。これは、ワークスペース内のファイルのコンテンツ・タイプの決定方法に影響を与えます。コンテンツ・タイプが競合した場合 (複数のコンテンツ・タイプが指定ファイルに対して同等に適している場合) に、対応するプロジェクト用に構成されたネーチャーのいずれかと親和性があるコンテンツ・タイプが選択されます。

<!ELEMENT extension (runtime , (one-of-nature | requires-nature | builder | content-type)* , options?)>

<!ATTLIST extension

point CDATA #REQUIRED

id    CDATA #REQUIRED

name  CDATA #IMPLIED>


<!ELEMENT runtime (run)>



<!ELEMENT run (parameter*)>

<!ATTLIST run

class CDATA #REQUIRED>


<!ELEMENT parameter EMPTY>

<!ATTLIST parameter

name  CDATA #REQUIRED

value CDATA #REQUIRED>


<!ELEMENT one-of-nature EMPTY>

<!ATTLIST one-of-nature

id CDATA #REQUIRED>


<!ELEMENT requires-nature EMPTY>

<!ATTLIST requires-nature

id CDATA #REQUIRED>


<!ELEMENT builder EMPTY>

<!ATTLIST builder

id CDATA #REQUIRED>


<!ELEMENT options EMPTY>

<!ATTLIST options

allowLinking (true | false) >


<!ELEMENT content-type EMPTY>

<!ATTLIST content-type

id CDATA #REQUIRED>


3 つのネーチャー構成の例を以下に示します。 waterNature と fireNature は同じ排他的セットに属しているため、同じプロジェクト上に共存できません。 snowNature には waterNature が必要であるため、snowNature は waterNature のないプロジェクトでは使用不可になります。その結果、fireNature のあるプロジェクトでは snowNature を使用可能にできないことになります。また、fireNature は、リンクされたリソースの作成を許可しません。

 
   

<extension id=

"fireNature"

name=

"Fire Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Fire"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

<options allowLinking=

"false"

/>

</extension>

<extension id=

"waterNature"

name=

"Water Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Water"

/>

</runtime>

<one-of-nature id=

"com.xyz.stateSet"

/>

</extension>

<extension id=

"snowNature"

name=

"Snow Nature"

point=

"org.eclipse.core.resources.natures"

>

<runtime>

<run class=

"com.xyz.natures.Snow"

>

<parameter name=

"installBuilder"

value=

"true"

/>

</run>

</runtime>

<requires-nature id=

"com.xyz.coolplugin.waterNature"

/>

<builder id=

"com.xyz.snowMaker"

/>

</extension>

これらの拡張機能が ID "com.xyz.coolplugin" を使用してプラグインに定義されていた場合、これらのネーチャーの完全修飾名は "com.xyz.coolplugin.fireNature"、"com.xyz.coolplugin.waterNature"、および "com.xyz.coolplugin.snowNature" になります。

class 属性の値は、org.eclipse.core.resources.IProjectNature の実装者を表す必要があります。ネーチャー定義は、org.eclipse.core.resources.IProjectNatureDescriptor インターフェースを使用して検査できます。これらの記述子オブジェクトは、org.eclipse.core.resources.IWorkspace で、 getNatureDescriptor(String) および getNatureDescriptors() を使用して取得できます。

プラットフォーム自体には、事前定義されたネーチャーはありません。特定の製品のインストールにより、ネーチャーの組み込みが可能です。