Durch Projektgattungen kann ein Plug-in ein Projekt mit einem Tag für eine bestimmte Projektgattung versehen. JDT (Java Development Tools - Java-Entwicklungstools) verwendet beispielsweise eine Gattung "Java", um Projekten ein Java-spezifisches Verhalten hinzuzufügen. Projektgattungen werden durch Plug-ins definiert und normalerweise projektspezifisch hinzugefügt oder entfernt, wenn der Benutzer eine durch das Plug-in definierte Aktion ausführt.
Einem Projekt können mehrere Gattungen zugeordnet sein. Wenn Sie eine Projektgattung definieren, können Sie jedoch besondere Einschränkungen für die Gattung definieren:
Wenn Sie eine eigene Gattung implementieren wollen, müssen Sie eine Erweiterung definieren und eine Klasse zur Verfügung stellen, die die Schnittstelle IProjectNature implementiert.
Am Erweiterungspunkt org.eclipse.core.resources.natures können Sie eine Definition für einen Projekttyp hinzufügen. Die folgende Formatierung fügt dem hypothetischen Plug-in com.example.natures einen Typ hinzu:
<extension point="org.eclipse.core.resources.natures" id="mynature" name="Mein Typ"> <runtime> <run class="com.example.natures.MyNature"> </run> </runtime> </extension>
Die in der Erweiterung angegebene Klasse muss die Plattformschnittstelle IProjectNature implementieren. Diese Klasse implementiert ein Plug-in-spezifisches Verhalten für die Zuordnung von typspezifischen Informationen zu einem Projekt, wenn der Typ konfiguriert ist.
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; } }
Die Methoden configure() und deconfigure() werden durch die Plattform gesendet, wenn Typen zu einem Projekt hinzugefügt oder aus diesem entfernt werden. Sie können die Methode configure() implementieren, um ein Erstellungsprogramm zu einem Projekt hinzuzufügen. Dies wird unter Erstellungsprogramme erläutert.
Die Definition einer Gattung genügt nicht, um diese einem Projekt zuzuordnen. Sie müssen einem Projekt eine Gattung zuordnen, indem Sie die Beschreibung des Projekts aktualisieren, so dass Sie die neue Gattung enthält. Dies geschieht normalerweise, wenn der Benutzer ein neues Projekt mit einem speziellen Assistenten für neue Projekte erstellt, der die Gattung zuordnet. Der folgende Code-Ausschnitt stellt dar, wie die neue Gattung einem vorhandenen Projekt zugeordnet werden kann.
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 }
ANMERKUNG: Die Natur-ID ist die vollständig qualifizierte ID der Naturerweiterung. Die vollständig qualifizierte ID einer Erweiterung wird durch Kombination der ID des Plug-ins mit der ID der einfachen Erweiterung in der Datei plugin.xml erstellt. Beispiel: Eine Natur mit der einfachen Erweiterungs-ID "mynature" in dem Plug-in "com.example.natures" würde den Namen "com.example.natures.mynature" erhalten.
Gattungen werden erst dann tatsächlich zum Projekt hinzugefügt (und für dieses konfiguriert), wenn die Projektbeschreibung im Projekt definiert wird. Außerdem ist zu beachten, dass als Gattungs-ID der vollständig qualifizierte Name (Plug-in-ID + Erweiterungs-ID) der Gattungserweiterung verwendet werden muss.
Falls für die Gattung Einschränkungen definiert wurden, kann die neue Gattung mit Hilfe der Arbeitsbereichs-API ausgewertet werden. Als Beispiel soll angenommen werden, dass eine Gattung mit einer Einschränkung definiert ist:
<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>
Die neue Gattung ist erst dann gültig, wenn die erste Gattung für das Projekt definiert wurde. Abhängig vom Aufbau des Plug-ins ist es unter Umständen sinnvoll, wenn Sie prüfen, ob die vorausgesetzte Gattung installiert wurde, oder wenn Sie die vorausgesetzte Gattung selber hinzufügen. Bei beiden Möglichkeiten können Sie jedoch die Gültigkeit der vorgeschlagenen Kombinationen von Projektgattungen mit der Arbeitsbereichs-API prüfen.
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); // 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 }
Mit Gattungen können Sie nicht nur über die ID arbeiten, sondern hierzu auch den Deskriptor (IProjectNatureDescriptor) abrufen, der eine Gattung, ihre Einschränkungen und ihre Bezeichnung abfragt. Sie können eine bestimmte Gattung nach ihrem Deskriptor abfragen oder aber die Deskriptoren aus dem Arbeitsbereich abrufen. Der folgende Codeausschnitt ruft den Projektgattungsdeskriptor für die neue Gattung ab:
IProjectNatureDescriptor descriptor = workspace.getNatureDescriptor("com.example.natures.myOtherNature");
Sie können auch einen Deskriptorenbereich für alle installierten Gattungen abrufen:
IProjectNatureDescriptor[] descriptors = workspace.getNatureDescriptors();