Descripción: el área de trabajo da soporte al concepto de naturalezas de proyecto (o "naturalezas", para abreviar). La naturaleza asocia el comportamiento del ciclo de vida con un proyecto. Se instala una naturaleza para cada proyecto utilizando para ello el método setDescription definido en org.eclipse.core.resources.IProject. Las naturalezas se configuran automáticamente cuando se añaden a un proyecto, y quedan desconfiguradas cuando se eliminan de un proyecto. Por ejemplo, la naturaleza Java podría instalar un constructor Java y realizar la configuración de otro proyecto cuando se añadiera a un proyecto.
El punto de extensión de las naturalezas permite a los escritores de naturalezas registrar la implementación de su naturaleza bajo un nombre simbólico que luego se utiliza desde dentro del área de trabajo para localizar y configurar naturalezas. El nombre simbólico es el ID de una extensión de la naturaleza. Al definir una extensión de la naturaleza, se anima a los usuarios a que incluyan para el atributo "name" un valor legible por personas que identifique su significado y pueda presentarse potencialmente a los usuarios.
Las naturalezas pueden especificar restricciones relacionales con otras naturalezas. La restricción "one-of-nature" indica que en un proyecto y en un momento dado puede existir como máximo una sola naturaleza de un determinado conjunto. Esta restricción impone la exclusión mutua de naturalezas que no sean compatibles entre sí. La restricción "requires-nature" indica que existe una dependencia de otra naturaleza. Cuando se añade una naturaleza a un proyecto, hay que añadir asimismo todas las naturalezas que sean necesarias. Las naturalezas tienen la garantía de que se van a configurar y a desconfigurar de tal manera que las naturalezas que se necesitan para ellas siempre se configurarán antes que ellas y se desconfigurarán después de ellas. Por esta razón, no están permitidas las dependencias cíclicas entre naturalezas.
No se pueden añadir naturalezas a un proyecto ni eliminarlas de un proyecto si el cambio que ello supone viola alguna de las restricciones satisfechas con anterioridad. Si se configura una naturaleza en un proyecto pero luego resulta que no se satisfacen las restricciones, esa naturaleza y todas las naturalezas que la necesitan quedan marcadas como disabled (inhabilitadas), aunque siguen permaneciendo en el proyecto. Esto puede suceder cuando, por ejemplo, falta una naturaleza necesaria en la instalación. Las naturalezas que faltan en la instalación y las naturalezas implicadas en ciclos de dependencias también quedan marcadas como inhabilitadas.
Las naturalezas también pueden especificar qué constructores incrementales de proyectos (si los hay) se configurarán mediante ellas. Con esta información, el área de trabajo se asegura de que los constructores solo se ejecuten cuando la naturaleza que les corresponde esté presente y habilitada en el proyecto que se esté construyendo. Si se elimina una naturaleza de un proyecto, pero el método de desconfiguración de la naturaleza no puede eliminar los correspondientes constructores, el área de trabajo eliminará dichos constructores automáticamente de la especificación de construcción. No está permitido que dos naturalezas especifiquen el mismo constructor incremental de proyecto en sus códigos XML.
Códigos XML de configuración:
<!ELEMENT runtime run?>
<!ELEMENT run parameter*>
<!ATTLIST run
class
CDATA #REQUIRED
>
Ejemplos:
A continuación figura un ejemplo de configuraciones de tres naturalezas. Las naturalezas del agua (waterNature) y del fuego (fireNature) pertenecen al mismo conjunto exclusivo y, por lo tanto, no pueden coexistir en un mismo proyecto. La naturaleza de la nieve (snowNature) necesita la naturaleza waterNature y, por ello, snowNature quedará inhabilitada en un proyecto en el que falte waterNature. De ello se sigue naturalmente que snowNature no puede estar habilitada en un proyecto que tenga fireNature.
<extension id="fireNature" name="Naturaleza del fuego" point="org.eclipse.core.resources.natures">
<runtime>
<run class="com.xyz.natures.Fire"/>
</runtime>
<one-of-nature id="com.xyz.stateSet"/>
</extension>
<extension id="waterNature" name="Naturaleza del agua"
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="Naturaleza de la nieve" 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>
Si estas extensiones estuviesen definidas en un conector cuyo id fuese "com.xyz.coolplugin", el nombre totalmente calificado de las naturalezas sería "com.xyz.coolplugin.fireNature", "com.xyz.coolplugin.waterNature" y "com.xyz.coolplugin.snowNature".
Información sobre las API: el valor del atributo class debe representar un implementador de org.eclipse.core.resources.IProjectNature. Las definiciones de las naturalezas se pueden examinar con la interfaz org.eclipse.core.resources.IProjectNatureDescriptor. Estos objetos descriptores se pueden obtener mediente los métodos getNatureDescriptor(String) y getNatureDescriptors() de org.eclipse.core.resources.IWorkspace.
Implementación suministrada: la propia plataforma no posee ninguna naturaleza predefinida. La instalación de algunos productos en particular puede incluir naturalezas en caso necesario.