Die Reflexions-Bibliothek funktioniert nicht, wenn sie in einem Eclipse-Plug-in verwendet wird

8

Ich habe eine Anwendung entwickelt, die die Bibliothek Reflections für die Abfrage aller Klassen mit einer bestimmten Anmerkung verwendet. Alles funktionierte wie ein Zauber, bis ich beschloss, ein Eclipse-Plug-in aus meiner Anwendung zu erstellen. Dann hören die Reflexionen auf zu arbeiten.

Da meine Anwendung gut funktioniert, wenn sie nicht Teil eines Eclipse-Plugins ist, sollte es meines Erachtens ein Class-Loader-Problem sein. Also habe ich meiner Klasse Reflections die Klassenladeprogramme der Plug-in-Aktivatorklasse, des Kontextklassenladeprogramms und aller anderen Klassenladeprogramme, die ich mir vorstellen konnte, ohne Erfolg hinzugefügt. Dies ist eine vereinfachte Version meines Codes:

%Vor%

Ich habe auch versucht, URLs der Klassen hinzuzufügen, die ich in die Klasse ConfigurationBuilder laden möchte, aber es hat nicht geholfen.

Könnte mir jemand sagen, ob es eine Möglichkeit gibt, Reflections work als Teil eines Eclipse-Plugins zu verwenden? Oder sollte ich besser nach einer anderen Alternative suchen? Vielen Dank, ich bin wirklich verwirrt darüber.

    
Sergio 01.12.2011, 10:30
quelle

3 Antworten

10

Ich nehme an, Sie wissen bereits, wie Sie Pakete erstellen (überprüfen Sie andernfalls das ).

Nach einigem Debuggen und Erforschen der Reflections-API habe ich festgestellt, dass Reflections einfach keine OSGi-URLs (bunerresource: // ...) lesen kann, was zu einer Ausnahme führt:

%Vor%

und dieser Vorschlag:

%Vor%

Ich glaube also, einen UrlType für OSGi zu implementieren (z. B. class BundleUrlType implements UrlType {...} ) und dies folgendermaßen zu registrieren:

%Vor%

sollte das Reflections API innerhalb eines Bundles verwenden. Reflexionsabhängigkeiten sollten dem Eclipse-Plugin-Projekt wie beschrieben hinzugefügt werden hier .

So sah mein Beispiel MANIFEST.MF nach dem Hinzufügen benötigter Gläser aus:

%Vor%

Hinweis: Verwendete Reflexionen v. 0.9.5

Hier ist eine Beispiel-UrlType-Implementierung:

%Vor%

Und so erstelle ich Reflexionen in der Activator-Klasse:

%Vor%

Das letzte Bit ist sehr verwirrend, aber immer noch wichtig: Wenn Sie Ihr Plugin innerhalb von Eclipse (Run As / OSGi Framework) ausführen, müssen Sie auch Ihr Klassen-Ausgabeverzeichnis zu den Reflections Pfadmustern hinzufügen (zB "bin" oder " Ziel / Klassen "). Obwohl es für ein veröffentlichtes Plugin nicht benötigt wird (zum Erstellen eines Plugins / Bundles "Export" -> "Installierbare Plugins und Fragmente").

    
Vlad 01.12.2011, 13:05
quelle
3

Nur für die Aufzeichnungen, falls jemand anders das gleiche Problem hat. Hier eine kleine Änderung an der Antwort von Vlad, um zu vermeiden, dass das Ausgabeverzeichnis zu den Reflections-Pfadmustern hinzugefügt werden muss. Der Unterschied besteht nur in der BundleDir-Klasse. Es scheint in allen meinen Tests gut zu funktionieren:

%Vor%     
Sergio 09.12.2011 20:23
quelle
1

Eclipse baut auf OSGi auf und Sie sind gegen das OSGi-Klassenladen ... und das ist kein einfacher Kampf um den Sieg.

Sehen Sie sich diesen Artikel von Neil Bartlett an: OSGi Readiness - Laden von Klassen . Sie können auch nach "OSGi buddy policy" googlen.

    
Tonny Madsen 01.12.2011 12:27
quelle