Natury projektów

org.eclipse.core.resources.natures

Obszar roboczy jest zgodny z ideą natur projektu (lub w skrócie: natur). Natura umożliwia powiązanie zachowania cyklu życia z projektem. Natury są instalowane w poszczególnych projektach przy użyciu metody setDescription zdefiniowanej w klasie org.eclipes.core.resources.IProject. Są one konfigurowane automatycznie podczas otwierania projektu i dekonfigurowane podczas jego zamykania. Na przykład natura Java może powodować instalowanie programu budującego Java oraz wykonywanie innych czynności konfiguracyjnych podczas dodawania do projektu.

Punkt rozszerzenia natur pozwala ich twórcom na rejestrowanie implementacji natur pod symboliczną nazwą, która jest następnie używana w obszarze roboczym do znajdowania i konfigurowania natur. Nazwa symboliczna to identyfikator rozszerzenia natury. Podczas definiowania rozszerzenia natur zalecane jest podawanie czytelnej dla człowieka wartości atrybutu name, która będzie identyfikowała jego znaczenie i będzie mogła być prezentowana użytkownikowi.

Natury mogą określać ograniczenia związków z innymi naturami. Ograniczenie one-of-nature określa, że w dowolnym momencie w projekcie może istnieć najwyżej jedna natura należąca do danego zestawu. Wymusza to wzajemne wykluczanie się natur, które są niezgodne z innymi naturami. Ograniczenie requires-nature określa zależność od innej natury. Podczas dodawania natury do projektu muszą także zostać dodane wszystkie wymagane przez nią natury. Natury są konfigurowane w taki sposób, że wymagane przez nie natury są zawsze konfigurowane przed nimi i dekonfigurowane po nich. Z tego powodu cykliczne zależności między naturami są niedozwolone.

Nie można dodawać natur do projektu ani usuwać ich z projektu, jeśli taka zmiana spowodowałaby naruszenie jakichkolwiek obowiązujących wcześniej ograniczeń. Jeśli natura zostanie skonfigurowana w projekcie, ale później okaże się, że jej ograniczenia nie zostały spełnione, natura ta oraz wszystkie wymagane przez nią natury zostaną oznaczone jako wyłączone, chociaż pozostaną w projekcie. Może się tak zdarzyć na przykład w przypadku niezainstalowania wymaganej natury. Natury niezainstalowane oraz natury uczestniczące w cyklach zależności również są oznaczane jako wyłączone.

Natury mogą również określać, które programy przyrostowo budujące projekty (o ile istnieją) są przez nie konfigurowane. Dzięki tym informacjom programy budujące są uruchamiane w obszarze roboczym tylko w przypadku, gdy w budowanym projekcie istnieje i jest włączona odpowiednia natura. Jeśli natura zostanie usunięta z projektu, ale metoda dekonfiguracji natury nie usunie odpowiednich programów budujących, programy te zostaną usunięte automatycznie przez obszar roboczy. Określenie przez dwie natury w ich języku znaczników tego samego programu przyrostowo budującego projekty jest niedozwolone.

Natury mogą także uniemożliwiać tworzenie dowiązanych zasobów w projektach, z którymi są powiązane. Przez ustawienie dla atrybutu allowLinking wartości "false" natura może zadeklarować, że dowiązane zasoby nie powinny być tworzone. Funkcja ta stanowi nowość w wersji 2.1.

Od wersji 3.1 natury mogą zadeklarować powinowactwo z wybranymi typami treści, co ma wpływ na sposób określania typu treści dla plików w obszarze roboczym. W przypadku konfliktów (dwa lub więcej typy treści uznane jako odpowiednie dla danego pliku) zostanie wybrany typ treści, który ma powinowactwo do dowolnej natury skonfigurowanej w odpowiednim projekcie.

<!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>


Poniżej przedstawiono przykładowe konfiguracje trzech natur. Natury waterNature i fireNature należą do tego samego wyłącznego zestawu, co powoduje, że nie mogą współistnieć w tym samym projekcie. Natura snowNature wymaga natury waterNature, dlatego natura snowNature będzie wyłączona w projekcie niezawierającym natury waterNature. Naturalną konsekwencją tego jest fakt, że nie można włączyć natury snowNature w projekcie zawierającym naturę fireNature. Natura fireNature nie pozwala również na tworzenie dowiązanych zasobów.

 
   

<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>

Jeśli rozszerzenia te zostały zdefiniowane w module dodatkowym o identyfikatorze com.xyz.coolplugin, pełnymi nazwami tych natur będą: com.xyz.coolplugin.fireNature, com.xyz.coolplugin.waterNature i com.xyz.coolplugin.snowNature.

Wartość atrybutu klasy musi reprezentować implementację klasy org.eclipse.core.resources.IProjectNature. Definicje natur można sprawdzić przy użyciu interfejsu org.eclipse.core.resources.IProjectNatureDescriptor. Obiekty deskryptora można uzyskać przy użyciu metod getNatureDescriptor(String) i getNatureDescriptors() w interfejsie org.eclipse.core.resources.IWorkspace.

Sama platforma nie zawiera żadnych wstępnie zdefiniowanych natur. W razie potrzeby natury mogą być dołączane wraz z instalacjami konkretnych produktów.