项目性质

org.eclipse.core.resources.natures

工作空间支持项目性质(或简称为“性质”)的概念。性质使生命周期行为与项目相关联。性质是根据项目用在 org.eclipes.core.resources.IProject 上定义的 setDescription 方法安装的。它们是在打开项目时自动配置的,并且在关闭项目时取消配置。例如,Java 性质可安装 Java 构建器并且在添加至项目时执行其它项目配置

性质扩展点允许性质编写者使用符号名称注册他们的性质实现,然后,在工作空间中使用此符号名称来查找和配置性质。该符号名称是性质扩展的标识。当定义性质扩展时,鼓励用户在“name”属性中包含人类可读的值,“name”属性标识它们的意义,并且可能显示给用户。

性质可以指定与其它性质的关系约束。“其中一种性质”约束指定在任何给定时间都只能有属于给定性质集的一种性质可以存在于项目中。这将使互相不兼容的性质之间产生互斥。“必需性质”约束指定对于另一种性质的依赖性。当将一种性质添加至项目时,也必须添加所有必需的性质。保证按以下这种方式来配置和取消配置性质:始终在配置性质之前配置它们的必需性质,然后在取消配置性质之后才取消配置必需的性质。因此,不允许性质之间的循环相关性。

如果更改将违反先前满足的任何约束,则不能将性质添加至项目或从项目中除去性质。如果在项目上配置了性质,但是后来发现未满足其约束,则会将该性质以及需要它的所有性质标记为禁用,但是它们会保留在项目中。例如,在必需的性质从安装中丢失时就可能会发生这种情况。还会将安装中丢失的性质以及依赖性循环中涉及的性质标记为禁用。

性质还可以指定哪些增量项目构建器(如果有)是由性质配置的。利用此信息,工作空间将确保构建器将只在它们相应的性质存在并且在正在构建的项目上启用它们时运行。如果从项目中除去了性质,但是性质的取消配置方法未能除去其相应的构建器,则工作空间将自动从规范中除去那些构建器。不允许两个性质在它们的标记中指定同一个增量项目构建器。

性质还具有禁止对它们与之相关联的项目创建链接的资源的能力。通过将 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,因此 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>

如果在具有标识“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.IWork 上的方法 getNatureDescriptor(String)getNatureDescriptors() 来获取这些描述符对象。

平台本身没有任何预定义的性质。必要时,特定产品安装可能包含性质。