Project natures allow a plug-in to tag a project as a specific kind of project. For example, the Java development tools (JDT) use a "Java nature" to add Java-specific behavior to projects.� Project natures are defined by plug-ins, and are typically added or removed per-project when the user performs some action defined by the plug-in.
A project can have more than one nature.� However, when you define a project nature, you can define special constraints for the nature:
To implement your own nature, you need to define an extension and supply a class which implements IProjectNature.
The org.eclipse.core.resources.natures extension point is used to add a project nature definition. The following markup adds a nature for the hypothetical com.example.natures plug-in.
The class identified in the extension must implement the platform interface IProjectNature. This class implements plug-in specific behavior for associating nature-specific information with a project when the nature is configured.
public class MyNature implements IProjectNature { private IProject project; public void configure() throws CoreException { // Add nature-specific information // for the project, such as adding a builder // to a project's build spec. } public void deconfigure() throws CoreException { // Remove the nature-specific information here. } public IProject getProject() { return project; } public void setProject(IProject value) { project = value; } }
The configure() and deconfigure() methods are sent by the platform when natures are added and removed from a project.� You can implement the configure() method to add a builder to a project as discussed in Builders.
Defining the nature is not enough to associate it with a project.� You must assign a nature to a project by updating the project's description to include your nature.� This usually happens when the user creates a new project with a specialized new project wizard that assigns the nature.� The following snippet shows how to assign our new nature to a given project.
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) { // Something went wrong }
NOTE: The nature id is the fully qualified id of the nature extension. The fully qualified id of an extension is created by combining the plug-in id with the simple extension id in the plugin.xml file. For example, a nature with simple extension id "mynature" in the plug-in "com.example.natures" would have the name "com.example.natures.mynature"
The natures are not actually assigned to (and configured) for the project until you set the project description into the project.� Also note that the identifier used for the nature is the fully qualified name (plug-in id + extension id) of the nature extension.
If the nature has been defined with constraints, then workspace API can be used to validate the new nature.� For example, suppose a nature is defined with a prerequisite:
id="myOtherNature" name="My Other Nature">
The new nature is not valid unless the first nature exists for the project.� Depending on the design of your plug-in, you may want to check whether the prerequisite nature has been installed, or you may want to add the prerequisite nature yourself.� Either way, you can check on the validity of proposed combinations of project natures using workspace API.
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(newNatures); // check the status and decide what to do if (status.getCode() == IStatus.OK) { description.setNatureIds(newNatures); project.setDescription(description, null); } else { // raise a user error ... } } catch (CoreException e) { // Something went wrong }
In addition to working with natures by their id, you can obtain the descriptor (IProjectNatureDescriptor) which describes a nature, its constraints, and its label.� You can query a particular nature for its descriptor, or get descriptors from the workspace.� The following snippet gets the project nature descriptor for our new nature:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
You can also get an array of descriptors for all installed natures:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();