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 "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
}
NOTA: O ID da natureza é o ID completo da extensão da natureza. O ID completo de uma extensão é criado com a combinação do id do plug-in com o ID simples da extensão no arquivo plugin.xml. Por exemplo, uma natureza com ID simples de extensão "mynature" no plug-in "com.example.natures" terá o nome "com.example.natures.mynature".
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();