Natury projektów umożliwiają modułowi dodatkowemu oznaczenie projektu jako projektu specjalnego rodzaju. Na przykład aby dodać do projektów zachowanie charakterystyczne dla języka Java, środowisko JDT używa "natury Java". Natury projektów są definiowane przez moduły dodatkowe i zazwyczaj są dodawane i usuwane w poszczególnych projektach, gdy użytkownik wykonuje daną akcję zdefiniowaną przez moduł dodatkowy.
Projekt może mieć więcej niż jedną naturę, ale w momencie definiowania jego natury można zdefiniować dla niej specjalny warunek:
Aby zaimplementować własną naturę, należy zdefiniować rozszerzenie i dostarczyć klasę implementującą interfejs IProjectNature.
Aby dodać definicję natury projektu, należy użyć punktu rozszerzenia org.eclipse.core.resources.natures. Poniższy fragment kodu dodaje naturę do hipotetycznego modułu dodatkowego 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>
Klasa zidentyfikowana w rozszerzeniu musi implementować interfejs platformy IProjectNature. Ta klasa implementuje specjalne zachowanie modułu dodatkowego przypisujące do projektu informacje dotyczące natury w trakcie jej konfigurowania.
public class MyNature implements IProjectNature { private IProject project; public void configure() throws CoreException { // Dodawanie informacji dotyczących natury // do projektu, na przykład dodawanie programu budującego // do specyfikacji budowania projektu. } public void deconfigure() throws CoreException { // Tutaj są usuwane informacje dotyczące natury. } public IProject getProject() { return project; } public void setProject(IProject value) { project = value; } }
Metody configure() i deconfigure() są wysyłane przez platformę w momencie dodawania natury do projektu lub jej usuwania. Metodę configure() można zaimplementować w celu dodania do projektu programu budującego w sposób opisany w sekcji Programy budujące.
Aby przypisać naturę do projektu, nie wystarczy ją zdefiniować. Konieczne jest przypisanie natury do projektu przez zaktualizowanie jego opisu o zapis dotyczący natury. Ma to miejsce zazwyczaj w momencie, gdy użytkownik tworzy nowy projekt za pomocą nowego specjalnego kreatora, który przypisuje naturę. Poniższy fragment kodu pokazuje, w jaki sposób przypisać nową naturę do danego projektu.
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) { // przypadek niepowodzenia }
Uwaga: Identyfikator natury jest pełnym identyfikatorem rozszerzenia natury. Pełny identyfikator rozszerzenia jest tworzony przez połączenie identyfikatora modułu dodatkowego z prostym identyfikatorem rozszerzenia z pliku plugin.xml. Na przykład natura o prostym identyfikatorze rozszerzenia "mynature" będąca częścią modułu dodatkowego "com.example.natures" ma nazwę "com.example.natures.mynature".
Natury nie są do końca przypisane do projektu (ani skonfigurowane), dopóki opis projektu nie zostanie wstawiony do projektu. Należy również zauważyć, że identyfikator używany przez naturę jest pełną nazwą jej rozszerzenia (identyfikator modułu dodatkowego + identyfikator rozszerzenia).
Jeśli dana natura została zdefiniowana z ograniczeniami, do sprawdzenia poprawności nowej natury może zostać użyty interfejs API obszaru roboczego. Załóżmy na przykład, że natura została zdefiniowana z wymaganiem wstępnym:
<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>
Jeśli pierwsza natura projektu nie istnieje, nowa natura nie będzie poprawna. W zależności od projektu modułu dodatkowego można sprawdzić, czy wstępnie wymagana natura została zainstalowana lub można ją dodać własnoręcznie. W obu przypadkach można sprawdzić poprawność proponowanej kombinacji natur projektu przy użyciu interfejsu API obszaru roboczego.
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); // sprawdzenie stanu i podjęcie decyzji o dalszych czynnościach if (status.getCode() == IStatus.OK) { description.setNatureIds(newNatures); project.setDescription(description, null); } else { // wywołanie błędu użytkownika ... } } catch (CoreException e) { // przypadek niepowodzenia }
Pracując z naturami według ich identyfikatorów, można dodatkowo otrzymać deskryptor (IProjectNatureDescriptor), który opisuje naturę, jej ograniczenia oraz jej etykietę. Zapytanie o deskryptor można wysłać do konkretnej natury lub można otrzymać deskryptory wszystkich natur z obszaru roboczego. Poniższy fragment kodu uzyskuje deskryptor natury projektu dla nowej natury:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
Deskryptory wszystkich zainstalowanych natur można uzyskać w postaci tablicy:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();