2011-07-18 2 views
0

J'ai le plugin A qui dépend du plugin B, j'essaye de charger une classe définie dans le plugin B du plugin A. Et je suis sûr que la classe est dans les paquets exportés. mais j'ai reçu ClassNotFoundException, est-ce que j'ai manqué quelque chose?eclipse rcp: problème de chargement de classe

page = (IPage) Class.forName(pageClass).newInstance(); 

messages d'erreur:

java.lang.ClassNotFoundException: amarsoft.dbmp.credit.web.dataobject.DOListPage 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:513) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:429) 
    at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:417) 
    at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:169) 
    at amarsoft.rcp.base.widgets.DefaultPageRegistry.findPage(DefaultPageRegistry.java:27) 
    at amarsoft.rcp.base.widgets.AbstractPageControler.showPage(AbstractPageControler.java:27) 
    at amarsoft.rcp.base.widgets.AbstractPageControler.showPage(AbstractPageControler.java:37) 
    at amarsoft.dbmp.function.ui.FunctionListPage$3.linkActivated(FunctionListPage.java:261) 
    at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleActivate(AbstractHyperlink.java:233) 
    at org.eclipse.ui.forms.widgets.AbstractHyperlink.handleMouseUp(AbstractHyperlink.java:327) 
    at org.eclipse.ui.forms.widgets.AbstractHyperlink.access$2(AbstractHyperlink.java:311) 
    at org.eclipse.ui.forms.widgets.AbstractHyperlink$4.handleEvent(AbstractHyperlink.java:125) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) 
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696) 
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660) 
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494) 
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) 
    at amarsoft.adt.rcp.ADTApplication.start(ADTApplication.java:29) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1410) 
    at org.eclipse.equinox.launcher.Main.main(Main.java:1386) 
+0

Si 'DOListPage' se trouve dans les paquets exportés, vous devriez pouvoir faire un' new DOListPage() 'ici sans erreur de compilation. Pourriez-vous essayer cela? – Kai

+0

Peut-être est-ce utile? http://codescale.wordpress.com/2009/05/22/basics-about-osgi-classloading/ – FlorianOver

+0

Platform.getBundle ("amarsoft.dbmp.credit.web.dataobject"). LoadClass (pageClass) .newInstance () fonctionne – CaiNiaoCoder

Répondre

1

Si vous Require-Bundle; pluginB de pluginA, alors un Class.forName(*) aurait dû fonctionner. Bien que je ferai remarquer que l'utilisation PageClass class = new PageClass(); fonctionnerait également. Pourquoi essayez-vous d'utiliser la réflexion quand vous pouvez simplement dépendre directement de cette classe?

Pour le modèle commun où vous fournissez un comportement de structure que d'autres plugins doivent étendre en fournissant des implémentations, eclipse fournit la notion de points/extensions d'extension. Le plugin A fournirait un point d'extension. Le plugin B listerait une extension pour ce point d'extension et fournirait une classe d'implémentation. Dans ce cas, le plugin B nécessite le plugin A, et non l'inverse.

Ensuite, le module A utilise org.eclipse.core.runtime.IExtensionRegistry.getConfigurationElementsFor(String) pour lire toutes les extensions contribuées et org.eclipse.core.runtime.IConfigurationElement.createExecutableExtension(String) pour instancier les implémentations apportées (le registre s'assure que la classe peut être instanciée).

+0

merci Paul! C'est utile. Pouvez-vous me dire où trouver une documentation détaillée ou un tutoriel sur le point Extension/Extension? – CaiNiaoCoder

+0

Je voudrais commencer par le tutoriel à http://www.vogella.de/articles/EclipseExtensionPoint/article.html –