Ho letto molto codice equinozio per questo, ma non riesco ancora a capire un modo non hacky di ottenere il classloader per un bundle di osgi nell'installazione di Eclipse equinox. Ce n'è uno?Come ottenere il classloader per un pacchetto in equinozio?
risposta
La risposta breve (certamente per OSGi 4.1, non sicuro di 4.2) è che non è possibile ottenere il classloader di un pacchetto. Tuttavia, l'interfaccia Bundle
espone un metodo loadClass()
e ciò consentirebbe di scrivere un classloader che avvolge l'API del bundle e delega a tale metodo loadClass()
. Oppure puoi risparmiare un po 'di tempo e utilizzare invece la classe BundleDelegatingClassLoader
di Spring DM.
Nel normale codice Java, è possibile ottenere il caricatore di classe che ha caricato un dato oggetto con
object.getClass().getClassLoader();
O anche solo
SomeType.class.getClassLoader();
Lo stesso vale per Equinox, basta usare un oggetto o di tipo che proviene dal pacchetto che ti interessa.
In OSGi 4.3 è possibile utilizzare:
bundle.adapt(BundleWiring.class).getClassLoader()
Il caricatore classe di un pacchetto può essere ottenuto tramite l'interfaccia BundleWiring. Ecco un breve esempio:
Bundle bundle = bundleContext.getBundle();
BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
ClassLoader classLoader = bundleWiring.getClassLoader();
Ma poi si ha un problema di bootstrap. Come ottieni quella prima istanza? – Geniedesalpages
Se si ha dipendenza dall'altro pacchetto, è possibile fare riferimento all'altra classe direttamente (SomeType.class) delegando i classloader di osgi tra i pacchetti in modo che provenga ancora dall'altro classloader. Se non si dispone di una dipendenza è necessario ottenere l'oggetto Bundle (utilizzando PackageAdmin) e utilizzare il pacchetto # loadClass come menzionato nell'altra risposta. –
Il caricamento della classe J2SE non è adatto per J2EE. http://stackoverflow.com/questions/34787419/pmd-rule-use-proper-class-loader-explaination – Poornan