Projektnaturer giver en plugin mulighed for at kode et projekt som en bestemt type projekt. JDT (Java-udviklingsværktøjet) bruger f.eks. en "Java-natur" til at tilføje Java-specifik funktionalitet til projekter. Projektnaturer defineres ved plugins og tilføjes og fjernes typisk projektvist, når brugeren foretager en funktion, der er defineret af plugin'en.
Et projekt kan have mere end én natur. Men når du definerer en projektnatur, kan du definere særlige betingelser for naturen:
Hvis du vil implementere din egen natur, skal ud definere en udvidelse og stille en klasse til rådighed, som implementerer IProjectNature.
Udvidelsespunktet org.eclipse.core.resources.natures bruges til at tilføje en projektnaturdefinition. Følgende kode tilføjer en natur for den hypotetiske plugin com.example.natures.
<extension point="org.eclipse.core.resources.natures" id="mynature" name="My Nature"> <runtime> <run class="com.example.natures.MyNature"> </run> </runtime> </extension>
Den klasse, der er identificeret i udvidelsen, skal implementere platformgrænsefladen IProjectNature. Denne klasse implementerer en plugin-specifik funktion til brug for tilknytning af naturspecifikke oplysninger til et projekt, når naturen konfigureres.
public class MyNature implements IProjectNature { private IProject project; public void configure() throws CoreException { // Tilføjer naturspecifikke oplysninger // for projektet, f.eks. tilføjelse af et // byggeprogram til et projekts byggespecifikationer. } public void deconfigure() throws CoreException { // Fjerner de naturspecifikke oplysninger her. } public IProject getProject() { return project; } public void setProject(IProject value) { project = value; } }
Metoderne configure() og deconfigure() sendes af platformen, når naturer tilføjes og fjernes fra et projekt. Du kan implementere metoden configure(), så den tilføjer et byggeprogram til et projekt, som det er angivet i Byggeprogrammer.
At definere en natur er ikke nok til at knytte den til et projekt. Du skal tildele en natur til et projekt, og det gøres ved at opdatere projektets beskrivelse, så den inkluderer naturen. Det sker som regel, når brugeren opretter et nyt projekt med en ny specialiseret projektguide, som tildeler naturen. Følgende stykke kode viser, hvordan den nye natur tildeles til et givet projekt.
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) { // Der er opstået en fejl }
Bemærk: Natur-id'en er den fuldstændige id for naturens udvidelse. Du opretter den fuldstændige id for en udvidelse ved at kombinere plugin-id'en med den simple udvidelses-id i filen plugin.xml. En natur med den simple udvidelses-id "mynature" i plugin'en "com.example.natures" får navnet "com.example.natures.mynature"
Naturene er ikke egentligt tildelt og konfigureret til projektet, før du har angivet projektbeskrivelsen i projektet. Bemærk også, at den id, der er brugt til naturen, er det fuldstændige navn (plugin-id + udvidelses-id) for naturudvidelsen.
Hvis naturen er defineret med betingelser, kan arbejdsområde-API'et bruges til at validere den nye natur. Antag, at en natur er defineret med en forudsætning:
<extension point="org.eclipse.core.resources.natures" id="myOtherNature" name="My Other Nature"> <runtime> <run class="com.example.natures.MyOtherNature"> </run> </runtime> <requires-nature id="com.example.natures.mynature"/> </extension>
Den nye natur er ikke gyldig, medmindre den første natur findes for projektet. Afhængig af plugin'ens design kan det være en god ide at kontrollere, om forudsætningsnaturen er installeret. Du kan også installere forudsætningsnaturen selv. Uanset, hvad du gør, kan du kontrollere de foreslåede projektnaturkombinationers validitet vha. arbejdsområde-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(natures); // kontrollerer status og beslutter, hvad der skal ske if (status.getCode() == IStatus.OK) { description.setNatureIds(newNatures); project.setDescription(description, null); } else { // viser en brugerfejl ... } } catch (CoreException e) { // Der er opstået en fejl }
Foruden at arbejde med naturer og deres id kan du hente beskrivelsen (IProjectNatureDescriptor), som beskriver en natur, dens betingelser og dens etiket. Du kan forespørge på en bestemt natur efter dens beskrivelse, eller du kan hente beskrivelser fra arbejdsområdet. Følgende stykke kode henter projektnaturbeskrivelsen til den nye natur:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
Du kan også hente en array af beskriveler for alle installerede naturer:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();