As naturezas do projeto permitem que um plug-in marque um projeto como um tipo específico de projeto. Por exemplo, o JDT (Ferramentas de Desenvolvimento Java) utiliza uma (JDT) "Natureza Java" para adicionar comportamento específico Java nos projetos. As naturezas dos projetos são definidas por plug-ins e são normalmente incluídas ou removidas de acordo com o projeto quando o usuário executa alguma ação definida pelo plug-in.
Um projeto pode ter mais de uma natureza. Entretanto, quando você define uma natureza de projeto, é possível definir restrições especiais para ela:
Para implementar uma natureza própria, você precisa definir uma extensão e fornecer uma classe que implemente IProjectNature.
O ponto de extensão org.eclipse.core.resources.natures é utilizado para incluir uma definição de natureza do projeto. A marcação a seguir inclui uma natureza para o plug-in hipotético com.example.natures.
<extension point="org.eclipse.core.resources.natures" id="myNature" name="Minha Natureza"> <runtime> <run class="com.example.natures.MyNature"> </run> </runtime> </extension>
A classe identificada na extensão deve implementar IProjectNature da interface da plataforma. Essa classe implementa o comportamento específico do plug-in para associação de informações específicas da natureza com um projeto, quando a natureza está configurada.
public class MyNature implements IProjectNature { private IProject project; public void configure() throws CoreException { // Incluir informações específicas da natureza // do projeto, como a inclusão de um construtor // na especificação de construção de um projeto. } public void deconfigure() throws CoreException { // Remover as informações específicas da natureza aqui. } public IProject getProject() { return project; } public void setProject(IProject value) { project = value; } }
Os métodos configure() e deconfigure() são enviados pela plataforma quando são incluídas e removidas naturezas de um projeto. É possível implementar o método configure() para adicionar um construtor ao projeto, conforme abordado em Construtores.
A definição da natureza não é suficiente para associá-la a um projeto. É necessário atribuir uma natureza a um projeto, fazendo a atualização da descrição do projeto para incluir a natureza. Isso normalmente acontece quando o usuário cria um novo projeto com um assistente especializado de novo projeto que atribui a natureza. O fragmento a seguir mostra como atribuir a nova natureza a um determinado projeto.
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) { // Algo deu errado }
As naturezas não são realmente atribuídas (e configuradas) ao projeto até que você defina a descrição do projeto dentro deste. Observe também que o identificador utilizado para a natureza é o nome completo (ID do plug-in + ID da extensão) da extensão da natureza.
Se a natureza tiver sido definida com restrições, a API do espaço de trabalho poderá ser utilizada para validar a nova natureza. Por exemplo, suponha que uma natureza seja definida com um pré-requisito:
<extension point="org.eclipse.core.resources.natures" id="myOtherNature" name="Minha Outra Natureza"> <runtime> <run class="com.example.natures.MyOtherNature"> </run> </runtime> <requires-nature id="com.example.natures.myNature"/> </extension>
A nova natureza não será válida a não ser que exista a primeira natureza do projeto. Dependendo do design do plug-in, você pode verificar se a natureza de pré-requisito foi instalada ou pode incluí-la você mesmo. De qualquer maneira, é possível verificar a validade das combinações de naturezas de projeto sugeridas utilizando a API do espaço de trabalho.
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(natures); // verificar o status e decidir o que fazer if (status.getCode() == IStatus.OK) { description.setNatureIds(newNatures); project.setDescription(description, null); } else { // surgiu um erro do usuário ... } } catch (CoreException e) { // Algo deu errado }
Além de trabalhar com naturezas pelo ID, é possível obter o descritor (IProjectNatureDescriptor) que descreve uma natureza, suas restrições e seu rótulo. É possível consultar em uma determinada natureza o seu descritor ou obter descritores do espaço de trabalho. O fragmento a seguir obtém o descritor de natureza do projeto da nossa nova natureza:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
Também é possível obter uma matriz de descritores para todas as naturezas instaladas:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();