Natures

Project-Natures definieren in Eclipse allgemein eine Assoziation zwischen einem Projekt und bestimmten Funktionen. Diese Funktionen können ganze Plug-Ins , aber auch nur ein bestimmte Gruppe von Funktionalitäten eines Plug-Ins oder Tools sein. In Zusammenhang mit einem Builder wird mit einer deklarierten Project-Nature signalisiert dass bestimmte Builder, auf die wiederum durch die Deklaration der Nature verwiesen wird, für die Übersetzung des Projekts aufgerufen werden. Project Natures werden nicht nur für die Verknüpfung von Projekt und Builder verwendet sondern werden in vielen anderen Fällen genutzt um bestimmte Funktionalitäten in Anhängigkeit vom jeweiligen Typ eines Projekt zu steuern. Ein Beispiel ist die Filterung von Einträgen in diversen Menüs die je nach Projekt-Nature unterschiedlich ist. Ein Projekt kann auch mehrere Natures haben, so hat z.B. ein Eclipse-Plug-In Projekt eine Java-Nature und eine Plug-In-Nature.

Deklaration

Die Deklaration einer Project-Nature ist Teil des Plugin-Manifests und findet in Form eines Extension-Points in der Datei plugin.xml statt. Eine Nature besteht dabei wiederum aus den Standard-Elementen Id, Anzeige-Namen,Extension-Point für Natures "org.eclipse.core.resources.natures" und ClassFile mit Implementierung der Nature-Funktionalität. Zusätzlich kann mit der Deklaration der Nature durch das Element "builder id" auch der zugeordnete Builder konfiguriert werden.

plugin.xml mit Nature-Deklaration

  <extension 
   	id="MyNature" 
   	name="My Nature" 
   	point="org.eclipse.core.resources.natures"> 
      <runtime> 
         <run class="besi.builderdemo.plugin.natures.MyNature"/> 
      </runtime> 
      <builder id="besi.builderdemo.plugin.mybuilder"/> 
   </extension>

Abhängigkeiten

Falls die Gültigkeit einer Nature bei einem Projekt von anderen Natures abhängig ist, so kann diese als Teil der Deklaration spezifiziert werden. Dabei werden zwei Fälle unterschieden: "Required-Nature" und "Conflicting-Natures". Im ersten Fall fordert eine Nature dass ein Projekt mindesten eine oder auch mehrere andere Natures besitzt. Im zweiten Fall fordert eine Nature dass einem Projekt nicht zwei Natures zugewiesen werden dürfen, die eine der conflicting-Natures gemeinsam haben.

plugin.xml mit einer Required Nature

  <extension 
     id="MyNature" 
     name="My Nature" 
     point="org.eclipse.core.resources.natures"> 
     <runtime> 
       <run class="besi.builderdemo.plugin.natures.MyNature"/> 
     </runtime> 
     <requires-nature id="org.eclipse.jdt.core.javanature"/> 
  </extension>

plugin.xml mit einer Conflicting Nature

  <extension 
     id="MyNature" 
     name="My Nature" 
     point="org.eclipse.core.resources.natures"> 
     <runtime> 
       <run class="besi.builderdemo.plugin.natures.MyNature"/> 
     </runtime> 
     <one-of-nature id="MyNature"/> 
  </extension>

Referenzierung

Ein Eclipse-Projekt verweist über einen entsprechenden Eintrag in der .project -Datei auf eine oder mehrere Natures, und drückt somit aus daß das Projekt eben dem Aufbau entspricht den die Funktionen, die auf selbige Natures ausgerichtet sind, voraussetzen.

Beispielabschnitt für eine .project - Datei mit java-nature

 
  <projectDescription>
    <name>Demo1</name>
    <comment></comment>
    <projects>
    </projects>
    <buildSpec>
      <buildCommand>
        <name>org.eclipse.jdt.core.javabuilder</name>
          <arguments></arguments>
      </buildCommand>
    </buildSpec>
    <natures>
      <nature>org.eclipse.jdt.core.javanature</nature>
    </natures>
  </projectDescription>

Verhalten

Eine Nature hat zum einen die Aufgabe eine Verbindung von Projekt und Plug-In herzustellen, sie kann aber auch ein Verhalten definieren. Im statischen Fall wird einem Projekt über den Eintrag in .project eine Nature zugewiesen werden und bleibt über die gesamte Laufzeit unverändert. In diesem Fall wird von der Nature kein spezifisches Verhalten gefordert. Es ist aber auch möglich eine Nature einem Projekt zur Laufzeit hinzuzufügen und von diesem zu entfernen. Eine Nature definiert somit einen Lebenszyklus, der auch vom Plugin gesteuert werden kann. In diesem Fall kann man über die Runtime-Klasse der Nature eine spezifisches Verhalten implementieren daß bei einem Zustandswechsel ausgeführt wird.Dazu muss das Plugin eine Java-Klasse bereitstellen die das Interface IProjectNature implementiert.IProjectNature deklariert die 4 Methoden getProject,setProject,configure,deconfigure.

Die Methoden von IProjectNature werden vom Eclipse-Framework aufgerufen wenn eine Nature einem Projekt hinzugefügt oder von diesem entfernt wird. Die Implementierung kann dann darauf reagieren. Beim Hinzufügen einer Nature wird die Methode configure aufgerufen, hier kann in die BuildSpec ein BuildCommand für den spezifischen Builder eingefügt und anschließend ein Build gestartet werden. Beim Entfernen wird die Methode deconfigure aufgerufen, hier kann die Nature z.b. diesen Eintrag wieder löschen und allfällige Builder-spezifische Marker entfernen.

Die folgende Übersicht zeigt die Aufruf-Sequenzen beim Hinzufügen einer Nature über einen Menü-Eintrag. Die Nummerierung bezeichnet die zeitliche Reihenfolge der Aufrufe

Dynamisches Hinzufügen einer Nature

Ein konkretes Projekt stellt über das Interface IProject die Methode setDescription zur Verfügung. Über diese Methode kann die Nature eines Projektes gesetzt werden, was im o.g. Beispiel dynamisch zur Laufzeit durch einen Menüeintrag geschieht (1). Durch Aufruf von setDescription (2) wird vom Eclipse-Framework ein <nature> Eintrag in der Projekt-Datei .project erstellt, der vorerst nur den Namen der Nature angibt. Das Eclipse-Framework instantiiert dann in weiterer Folge die damit verbundene Nature und ruft deren Methode configure (3) auf. Die konkrete Nature kann dann ihrerseits wiederum die Methode auf IProject setDescription aufrufen (4) um dort die für die spezifische Build-Commands zu hinterlegen, diese wird vom Eclipse-Framework wiederum in der Projekt-Datei .project abgelegt.

Zuletzt geändert am 15. Juli 2010 um 11:16