プロジェクト・ネーチャーによって、プラグインはプロジェクトを特定の種類のプロジェクトとしてタグ付けできます。 例えば、Java 開発ツール (JDT) は Java ネーチャーを使用して Java 固有の振る舞いをプロジェクトに追加します。 プロジェクト・ネーチャーは、プラグインによって定義され、一般に、 プラグインによって定義されたアクションをユーザーが実行したときにプロジェクトごとに追加または除去されます。
プロジェクトは、1 つ以上のネーチャーを持つことができます。 ただし、プロジェクト・ネーチャーを定義するときには、以下のネーチャーの特殊制約を定義できます。
ユーザー固有のネーチャーをインプリメントするには、拡張を定義して、IProjectNature をインプリメントするクラスを指定します。
org.eclipse.core.resources.natures 拡張ポイントは、プロジェクト・ネーチャー定義の追加で使用します。次のマークアップは、com.example.natures 仮想プラグイン用のネーチャーを追加します。
<extension point="org.eclipse.core.resources.natures" id="myNature" name="My Nature"> <runtime> <run class="com.example.natures.MyNature"> </run> </runtime> </extension>
拡張で識別されるクラスは、 プラットフォーム・インターフェース IProjectNature をインプリメントする必要があります。このクラスは、 ネーチャーの構成時に、ネーチャーの固有情報をプロジェクトに関連付けるために、プラグイン固有の振る舞いをインプリメントします。
public class MyNature implements IProjectNature { private IProject project; public void configure() throws CoreException { // Add nature-specific information // for the project, such as adding a builder // to a project's build spec. } public void deconfigure() throws CoreException { // Remove the nature-specific information here. } public IProject getProject() { return project; } public void setProject(IProject value) { project = value; } }
configure() および deconfigure() メソッドは、ネーチャーが、 プロジェクトに追加および除去されるときに、プラットフォームによって送信されます。 「ビルダー」で解説されているように、 configure() メソッドをインプリメントして、 ビルダーをプロジェクトに追加できます。
ネーチャーは、定義するだけではプロジェクトに関連付けることはできません。 プロジェクトの記述を更新してネーチャーを組み込むことによって、ネーチャーをプロジェクトに割り当てる必要があります。 これは通常、ネーチャーを割り当てる特殊な新規プロジェクト・ウィザードを使用してユーザーが新しいプロジェクトを作成するときに発生します。 以下のコードの断片は、新しいネーチャーを指定のプロジェクトに割り当てる方法を示しています。
try { IProjectDescription description = project.getDescription(); String[] natures = description.getNatureIds(); String[] newNatures = new String[natures.length + 1]; System.arraycopy(natures, 0, newNatures, 0, natures.length); newNatures[natures.length] = "com.example.natures.myNature"; description.setNatureIds(newNatures); project.setDescription(description, null); } catch (CoreException e) { // Something went wrong }
プロジェクトへのネーチャーの割り当て (および構成) は、プロジェクト記述をプロジェクトに設定するまで、実際には行われません。 また、ネーチャーに使用される ID が、ネーチャー拡張機能の完全修飾名 (プラグイン ID + 拡張機能 ID) であることに注意してください。
ネーチャーが制約付きで定義されてい場合、新しいネーチャーの妥当性検査を行うため、ワークスペース API を使用できます。 例えば、ネーチャーが次の前提条件付きで定義されていると想定します。
<extension point="org.eclipse.core.resources.natures" id="myOtherNature" name="My Other Nature"> <runtime> <run class="com.example.natures.MyOtherNature"> </run> </runtime> <requires-nature id="com.example.natures.myNature"/> </extension>
新しいネーチャーは、プロジェクト用の最初のネーチャーが存在しない限り無効です。 プラグインの設計によって、前提条件ネーチャーがインストールされているかどうかを検査するか、または前提条件ネーチャーを独自に追加することができます。 どちらの方法でも、ワークスペース API を使用して、意図したプロジェクト・ネーチャーの組み合わせの妥当性を検査できます。
try { IProjectDescription description = project.getDescription(); String[] natures = description.getNatureIds(); String[] newNatures = new String[natures.length + 1]; System.arraycopy(natures, 0, newNatures, 0, natures.length); newNatures[natures.length] = "com.example.natures.myOtherNature"; IStatus status = workspace.validateNatureSet(natures); // check the status and decide what to do if (status.getCode() == IStatus.OK) { description.setNatureIds(newNatures); project.setDescription(description, null); } else { // raise a user error ... } } catch (CoreException e) { // Something went wrong }
ネーチャーを ID で操作する方法に加え、ネーチャー、制約、およびラベルを記述するディスクリプター (IProjectNatureDescriptor) を取得できます。 特定のネーチャーに対してディスクリプターの照会を行うか、ワークスペースからディスクリプターを取得することができます。 次のコードの断片は、新しいネーチャーのプロジェクト・ネーチャー・ディスクリプターを取得します。
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
次のように、すべてのインストールされたネーチャーについて、ディスクリプターの配列を取得することもできます。
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();