Eclipse Plugin Fragment

Hat jemand ein “Hallo Welt” -Beispiel oder Tutorial zum Erstellen eines Eclipse-Plugin-Fragments?

Ich habe ein funktionierendes Host-Plugin, das der Einfachheit halber nur …

public void start(BundleContext context) throws Exception { System.out.println("Hello...."); super.start(context); plugin = this; } public void stop(BundleContext context) throws Exception { System.out.println("Goodbye..."); plugin = null; super.stop(context); } 

Einfach genug und funktioniert. Jetzt möchte ich ein Fragment zu diesem Host hinzufügen, was nicht so einfach ist wie das Erstellen eines Plugin-Hosts. Ich sehe einfach nicht, wie man ein Fragmentprojekt erstellt und Logik hinzufügt. Nehmen wir an, ich möchte einfach etwas Einfaches machen und das Fragment haben, um beim start() und “Goodbye2” bei stop() ein “Hello2” zu drucken. Kann mir jemand ein funktionierendes Beispiel geben?

  1. Eclipse -> Datei -> Neu … -> Fragment-Projekt -> setze das Host-Plugin (entweder in deinem Arbeitsbereich oder in den Plugins der Zielplattform).

  2. Öffnen Sie den Plugin-Manifest-Editor (Sie können dies tun, indem Sie auf build.properties , manifest.mf oder fragment.xml klicken – wenn es keine solche Datei gibt, erstellen Sie sie build.properties )

  3. Klicken Sie in der Registerkarte Erweiterungen auf Hinzufügen und fügen Sie org.eclipse.ui.startup und browse class hinzu, die die class org.eclipse.ui.IStartup implementiert.

  4. Erstellen Sie diese class und implementieren Sie sie. Sie müssen die Methode earlyStartup() implementieren, die den Einstiegspunkt für das Fragment darstellt.

Hinweis: Die folgenden Zeilen sind nur ein Beispiel. Ich habe es nicht getestet, also könnte es Fehler geben …

Alles, was Sie brauchen, ist dies (das ist Projektstruktur / Verzeichnisstruktur):

  • Fragment-Projekt – Wurzelverzeichnis
    • / META-INF
      • MANIFEST.MF
    • / src (welches Quellverzeichnis ist)
      • FragmentStartClass.java (die die org.eclipse.ui.IStartup-Schnittstelle und die earlyStartup-Methode implementieren)
    • build.properties
    • fragment.xml

META-INF / MANIFEST.MF Inhalt:

 Manifest-Version: 1.0 
 Bundle-ManifestVersion: 2 
 Paketname: FragmentProject 
 Bundle-SymbolicName: FragmentProject; Singleton: = True 
 Bundle-Version: 1.0.0 
 Bundle-ClassPath: src / ,. 
 Fragment-Host: * HostPluginProjectSymbolicName *; Bundle-Version = "1.0.0" 
 Bundle-RequiredExecutionEnvironment: J2SE-1.5 
 Require-Paket:  

build.properties Inhalt:

 Quelle .. = src, \
 Ausgabe .. = bin /
 bin.includes = META-INF /,
               .,
                   fragment.xml

fragment.xml Inhalt:

 < ? xml version = "1.0" encoding = "UTF-8"?>
 < ? eclipse version = "3.2"?>
 
    
       
       
    
 

FragmentStartClass.java Inhalt:

 import org.eclipse.ui.IStartup;


 Öffentliche class FragmentStartClass implementiert IStartup {

     public void earlyStartup () {
        System.out.println ("Hallo Welt aus Fragment!");

     }


 }

Nun, zuerst, was versuchst du zu erreichen? Sind Sie sicher, dass Fragmente die Lösung sind?

Fragmente sind einfach Ergänzungen zu einem bestehenden Plugin. Es gibt keinen Bündel-Aktivator, um das Fragment “hochzufahren”. Sie erhalten nur die zusätzlichen Ressourcen im Fragment. Sie könnten einen Erweiterungspunkt verwenden, um den Host darüber zu informieren, dass eine bestimmte functionalität durch ein vorhandenes Fragment erweitert wurde. Stellen Sie sich vor, dass die beiden zur Laufzeit merge.

Sieh dir diese Notiz im Eclipse Wiki an .

Ich bin mir nicht sicher, ob Sie das tun können, ohne dass das Host-Plugin etwas über das Laden des zusätzlichen Implementierungscodes des Fragments weiß.

Beispielsweise:

 MyInterface o = null; try { Class< ?> c = getClass().getClassLoader().loadClass("my.fragment.Activator"); o = (MyInterface) c.newInstance(); } catch (ClassNotFoundException e) { } if (o != null) { o.start(); } 

Dabei ist MyInterface eine Schnittstelle, die im Host-Plugin definiert und von Ihrem Fragment implementiert wird.

Ein anderer Weg könnte darin bestehen, dass das Fragment einen Erweiterungspunkt bereitstellt, der die erweiterte class identifiziert, aber das ist wahrscheinlich mehr, als benötigt wird.

Ich denke, was du versuchst zu tun ist besser, wenn du Erweiterungspunkte und separate Plugins verwendest, da du dem Basis-Plugin functionalität hinzufügen willst.

Fragmente werden nur zum Hinzufügen von Ressourcen oder zusätzlichen classn zum Basis-Plugin verwendet.

Für den Datensatz habe ich gerade ein Eclipse-Fragment erstellt, das einige PMD Java Rule-classn enthält.

Neben den classndateien ist nur eine Datei in diesem Jar erforderlich: META-INF/MANIFEST.MF :

 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: com.acme.tools.pmd Bundle-SymbolicName: com.acme.tools.pmd;singleton:=true Bundle-Version: 1.0.0 Fragment-Host: net.sourceforge.pmd.eclipse.plugin;bundle-version="3.2.6" Bundle-RequiredExecutionEnvironment: J2SE-1.5 

Ich habe das mit aktuellem Eclipse 3.7 versucht. Die Deployment-function besteht darin, die Jar-Datei in /dropins/plugins (diesen Ordner zu erstellen, falls er noch nicht vorhanden ist).