Les réflexions de la bibliothèque ne fonctionne pas lorsque utilisé dans un plug-in Eclipse
J'ai développé une application en utilisant le Réflexions bibliothèque pour interroger toutes les classes d'une annotation. Tout fonctionnait comme un charme jusqu'à ce que j'ai décidé de créer un plug-in Eclipse à partir de mon application. Alors les Réflexions d'arrêt de travail.
Étant donné que mon application fonctionne bien ne faisant pas partie d'un plug-in Eclipse, je pense qu'il devrait y avoir une classe-chargeur de problème.
J'ai donc ajouté à mon Reflections
classe les chargeurs de classes du plug-in de l'activateur de la classe, le contexte de la classe loader, et tous les autres classe chargeurs que j'ai pu imaginer, sans aucun succès. C'est une version simplifiée de mon 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
J'ai aussi essayé d'ajouter les Url des classes que je veux charger de la ConfigurationBuilder
classe, mais il n'a pas aidé.
Quelqu'un pourrait-il me dire si il existe un moyen de faire Reflections
travail dans le cadre d'un plug-in Eclipse ?, ou devrais-je mieux de regarder pour une autre alternative ?. Merci beaucoup, je suis vraiment perplexe à ce sujet.
OriginalL'auteur Sergio | 2011-12-01
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous savez déjà comment créer des bundles (sinon, vérifiez cette).
Après quelques debuging et à l'exploration des Réflexions de l'API, j'ai réalisé que le problème est que la réflexion omet simplement de lire OSGi Url (bundleresource://...) aboutissant à une exception:
et cette suggestion:
Je crois donc que la mise en œuvre d'un UrlType pour OSGi (par exemple
class BundleUrlType implements UrlType {...}
) et de l'enregistrer comme ceci:devrait faire des Réflexions API utilisable à partir de l'intérieur d'un bundle. Réflexions dépendances doit être ajouté le Plugin Eclipse projet tel que décrit ici.
C'est comment mon exemple MANIFESTE.MF ressemblait après l'ajout nécessaire de pots:
Remarque: Utilisé Réflexions v. 0.9.5
Voici un exemple de UrlType mise en œuvre:
Et c'est de cette façon que je créer les reflets dans la classe Activator:
Le dernier bit est très déroutant, mais toujours important: si vous exécutez votre plugin dans Eclipse (Exécuter en tant Qu' /OSGi Cadre), vous devez ajouter également vos classes répertoire de sortie des Réflexions chemin de modèles (c'est à dire "bin" ou "target/classes"). Bien que, il n'est pas nécessaire pour une sorti plugin (pour construire un plugin/bundle faire "Exporter"->"Déployable des plugins et des fragments").
J'ai mis à jour la réponse à mes conclusions (réponse précédente n'a pas d'apporter une solution). Malheureusement, il est arrivé à être beaucoup moins simple. L'espoir, ça va aider.
Merci beaucoup pour l'expansion de votre réponse @Vlad. J'ai essayé de mettre en œuvre, sans succès jusqu'à maintenant. Si j'ai bien compris à partir de votre nouvelle réponse, j'ai besoin que le plugin bundle et les Réflexions pot dans son bundle classpath (comme je l'ai eu à l'origine). Donc, je suis ignorant la réponse précédente à propos de mettre Réflexions dans un autre bundle, est-ce correct ?. À propos de votre fichier manifeste: Votre "Bundle-ClassPath' ressemble à la mienne, dans mon "Export-Package' je n'ai pas une".les données de fichier que vous, et dans l 'Import-Package' je ne vois pas les dépendances que vous avez, est-ce important pour les Réflexions de travailler?
Dans votre test: avez-vous d'utiliser le "ConfigurationBuilder>>addClassLoader()" méthode pour définir un spécial chargeur de classe? ou de manipuler les chargeurs de classe n'était pas nécessaire ?. C'est le message d'erreur que je vais avoir dans la console: "20 [Thread-1] ERREUR org.les réflexions.Réflexions - scan url sont vides. définir les url dans la configuration". Je suis entrain de créer un FilterBuilder objet: "FilterBuilder fb = new FilterBuilder();" et après, pour ce faire: "fb.inclure(FilterBuilder.préfixe("mypackageroot"));". Comme vous me recommander, je suis en train de faire de même pour le répertoire de sortie: fb.inclure(FilterBuilder.préfixe("bin"));"
Oui, ignorer la réponse précédente. Il est important pour importer tous les requis des bocaux, vous devez les ajouter manuellement comme décrit dans l'article, je fournis un lien dans la réponse (sauf si vous utilisez maven avec eclipse, osgi plugins pour construire votre projet).
OriginalL'auteur Vlad
Juste pour les enregistrements au cas où quelqu'un d'autre a le même problème.
Voici une petite modification à la réponse de Vlad afin d'éviter d'avoir à ajouter le répertoire de sortie pour les Réflexions chemin de modèles.
La différence est seulement dans la BundleDir classe. Il semble bien fonctionner dans tous mes tests:
OriginalL'auteur Sergio
Éclipse est de construire au-dessus d'OSGi et vous êtes contre OSGi de chargement de classe... et qui n'est pas un combat facile pour gagner.
Ont un coup d'oeil à cet article de Neil Bartlett: OSGi La Capacité De Chargement Des Classes. Aussi, vous pouvez google pour "OSGi copain de la politique".
Vous pouvez faire les Réflexions de la bibliothèque dans un bundle OSGi et puis ajoutez le
DynamicImport-Package: *
tête à se manifester.mf. Vous pouvez faire la première bundle à partir de l'existant fichier jar à l'aide de la "Nouveau Projet"->"Plug-in existant JAR Archive" assistant... Bonne chance.OriginalL'auteur Tonny Madsen