Reflections-Bibliothek funktioniert nicht, wenn in einer Eclipse-plug-in
Habe ich eine Anwendung entwickelt, mit der Reflexionen Bibliothek für das Abfragen von allen Klassen mit einer bestimmten annotation. Alles arbeitete wie ein Charme, bis ich mich dazu entschloss, ein Eclipse-plug-in aus meiner Anwendung. Dann Reflexionen aufhören zu arbeiten.
Gegeben, dass mein Antrag ist in Ordnung, wenn Sie nicht Teil eines Eclipse-plug-in, ich denke, es sollte eine class-loader-problem.
So habe ich Hinzugefügt, um meine Reflections
Klasse den classloadern der plug-in-activator-Klasse, die context-class-loader und alle anderen class loader könnte ich mir vorstellen, ohne Erfolg. Dies ist eine vereinfachte version von meinem code:
ConfigurationBuilder config = new ConfigurationBuilder();
config.addClassLoaders(thePluginActivatorClassLoader);
config.addClassLoaders(ClasspathHelper.getContextClassLoader());
config.addClassLoaders("all the classloaders I could imagine");
config.filterInputsBy(new FilterBuilder().include("package I want to analyze"));
Reflections reflections = new Reflections(config);
Set<Class<?>> classes = reflections.getTypesAnnotatedWith(MyAnnotation.class); //this Set is empty
Ich habe auch versucht, das hinzufügen von URLs, die von den Klassen, die ich laden will, um die ConfigurationBuilder
Klasse, aber es hat nicht geholfen.
Könnte mir jemand sagen, ob es einen Weg gibt, um Reflections
Arbeit als Teil eines Eclipse-plug-in ?, oder sollte ich besser suchen Sie eine andere alternative ?. Vielen Dank, ich bin wirklich verwundert darüber.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie wissen bereits, wie man bundles erstellen (andernfalls prüfen Sie,diese).
Nach etwas debugging und Erforschung der Reflections-API habe ich gemerkt, dass das problem ist, dass die Reflexionen einfach nicht zu Lesen OSGi-URLs (bundleresource://...), die sich in einer Ausnahme:
und dieser Vorschlag:
So, ich glaube, die Implementierung einer UrlType für OSGi (z.B.
class BundleUrlType implements UrlType {...}
) und registrieren Sie es wie folgt:sollte Reflections API verwendbar, die aus einem bundle. Reflexionen Abhängigkeiten Hinzugefügt werden sollte, um die Eclipse-Plugin-Projekt, wie beschrieben,hier.
Dies ist, wie mein Beispiel-MANIFEST.MF sah aus wie nach hinzufügen der benötigten Gläser:
Hinweis: Verwendet Reflexionen v. 0.9.5
Hier ist ein Beispiel-UrlType Umsetzung:
Und dies ist, wie ich das erstellen der Reflexionen in der Activator-Klasse:
Das Letzte Stück ist sehr verwirrend, aber trotzdem wichtig: wenn das plugin in Eclipse (Run As /OSGi-Framework), müssen Sie auch Ihre Klassen Ausgabe-Verzeichnis, um die Reflexionen Weg Muster (z.B. "bin" oder "target/classes"). Obwohl, es wird nicht benötigt für eine freigegebene Plug-in (build eine plugin/bundle tun "Export"->"Deployable plugins and fragments").
createReflections
Methode, und hier ist, wie ich hatte, es zu ändern (hinzufügen der "bin" - Präfix), damit es funktioniert, wenn Sie von der Eclipse-IDE:Reflections reflections = new Reflections(new Object[] { "reflectiveplugin.data", "bin" });
. Aber wenn Sie es tun, mitConfigurationBuilder
sollten Sie nicht vergessen, sich zu registrieren-Scanner. Überprüfen SieReflections(final Object[] urlHints, final Scanner... scanners)
Konstruktor, delegiert er an den Konstruktor mit der Konfiguration argument.Nur für die Akten, falls jemand anderes das gleiche problem.
Hier eine kleine änderung zu der Antwort von Vlad in, um zu vermeiden, fügen Sie die Ausgabe-Verzeichnis, um die Reflexionen Weg Muster.
Der Unterschied liegt nur in der BundleDir Klasse. Es scheint gut zu funktionieren in allen meinen tests:
Eclipse bauen auf OSGi und Sie sind gegen OSGi class loading... und das ist nicht leicht, die Schlacht zu gewinnen.
Haben Sie einen Blick auf diese Artikel von Neil Bartlett: OSGi-Bereitschaft — Laden Von Klassen. Sie können auch google für "OSGi-buddy-Politik".
DynamicImport-Package: *
Position zu manifestieren.mf. Sie können das erste Bündel aus der bestehenden jar-Datei mit dem "Neuen Projekt"->"-Plug-in von bestehenden JAR-Archiv" Assistent... viel Glück.