專案本質

org.eclipse.core.resources.natures

工作區支援專案本質(或簡稱「本質」)的概念。 本質建立生命週期行為與專案的關聯性。 本質使用定義在 org.eclipes.core.resources.IProject 中的 setDescription 方法安裝在各個專案上。 當開啟專案時,即會自動配置它們,當關閉專案時,即會解除配置它們。 例如,Java 本質可能安裝 Java 建置器,並且當新增至專案時執行其他專案的配置。

本質延伸點可讓本質作者將他們的本質實作登錄在某符號名稱之下,再從工作區中,利用這個符號名稱來尋找和配置本質。 符號名稱是本質延伸的 ID。在定義本質延伸時,建議使用者為 "name" 屬性併入一個可辦識的值, 以指出它們的意義以及可能呈現給使用者的意義。

本質可以指定和其他本質的關係限制。 "one-of-nature" 限制指出給定的本質集在任何給定的時間裡最多只有一個本質存在於專案中。 這個限制強化了不相容的本質間相互的排外性。"requires-nature" 限制指定另一個本質的相依關係。 新增本質至專案時,也必須新增所有需要的本質。 這些本質保證用一定的方式配置以及解除配置, 這樣他們所需的本質一律在他們被配置前配置而在他們被解除配置後才解除。 因為這個原因,在本質之間不允許循環的相依關係。

如果變更違反了任何之前滿足的限制,將無法由專案中新增或移除本質。 如果本質已配置於這個專案中,之後才發現不滿足它的限制,則所有需要它的本質會被標示為停用,但是還是存在於專案中。 這有可能發生,例如,所需的本質在安裝過程中遺漏。安裝過程中遺漏的本質以及與相依關係循環有關的本質都被標示為停用。

本質也可以指定由它們配置的增量專案建置器(如果有的話)。根據這個資訊, 工作區將確定僅在對應的本質出現,而且在要建置的專案啟用了它時, 才會執行建置器。如果將本質由專案中移除,但是本質的解除配置方法無法移除對應的建置器, 工作區將自動由規格中移除那些建置器。不允許兩個本質在它們的標記中指定同一個增量專案建置器。

本質也具有不容許在與它們相關聯的專案上建立鏈結資源的能力。藉由將 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>


下列是三個本質配置的範例。waterNature 和 fireNature 屬於同一個互斥集,所以它們無法同時存在於同一個專案中。 snowNature 需要 waterNature,所以在遺漏 waterNature 的專案上將停用 snowNature。 因此,自然地隨後將無法在具有 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() 方法,來取得描述子物件。

平台本身沒有任何預先定義的本質。 特定產品安裝可能會依需要而含有本質。