[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [equinox-dev] NPE from RegistryStrategyOSGI.onStop()


Looking in your manifest.mf I see this:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Test Plug-in
Bundle-SymbolicName: registry.test
Bundle-Version: 1.0.0
Bundle-Activator: registry.test.Activator
Bundle-Localization: plugin
Import-Package: org.osgi.framework;version="1.3.0"
Require-Bundle: org.eclipse.equinox.registry

Whenever you get a NoClassDefFoundError that most likely cause is that you incorrectly defined the bundle's dependencies in the manifest.mf.  Since the IExtensionRegistry class is in the bundle org.eclipse.core.runtime you MUST do one of the following:

- Use the Import-Package header to declare a dependency on the *package* org.eclipse.core.runtime.
- Use the Require-Bundle header to declare your dependency on the *bundle* org.eclipse.core.runtime.

Either will work.  Sometimes it is hard for people to decide which header to use.  My rule of thumb is as follows:

- If you absolutely depend upon the bundle then use Require-Bundle.  This is most often the case when you are extending an extension-point defined in a particular bundle.  Since there is never a possibility that another bundle could provide the extension point on which you dependent it makes sense to always use Require-Bundle for this sort of dependency.

- If all you care about is a code dependency on a particular type in a particular package then use Import-Package.  This is the case where you are depending on an implementer of some well defined API and you really don't care who the provider is, so long as it provides the correct API.  Use Import-Package when there could be multiple exporters of the package on which  you depend, otherwise just use Require-Bundle.

I hope this helps,

Simon



"Jason Hao" <jason.hao@xxxxxxxxx>
Sent by: equinox-dev-bounces@xxxxxxxxxxx

10/22/2006 10:54 PM

Please respond to
Equinox development mailing list <equinox-dev@xxxxxxxxxxx>

To
"Equinox development mailing list" <equinox-dev@xxxxxxxxxxx>
cc
Subject
Re: [equinox-dev] NPE from RegistryStrategyOSGI.onStop()





Oleg,

Thanks for you quick answer. I tried your suggestion but it didn't work as you described. I added an activator class into MyBundle. MyBundle's
activator#start() is called after org.eclipse.equinox.registry's. And so does the activator#stop().This is even worse. Because I got another exception in MyBundle's activator#stop() method.

java.lang.NoClassDefFoundError: org/eclipse/core/runtime/IExtensionRegistry
   at registry.test.Activator.stop(Activator.java:30)
   at org.eclipse.osgi.framework.internal.core.BundleContextImpl$3.run (BundleContextImpl.java:1032)
   at java.security.AccessController.doPrivileged(Native Method)
   at org.eclipse.osgi.framework.internal.core.BundleContextImpl.stop(BundleContextImpl.java:1028)
   at org.eclipse.osgi.framework.internal.core.BundleHost.stopWorker (BundleHost.java:396)
   at org.eclipse.osgi.framework.internal.core.AbstractBundle.suspend(AbstractBundle.java:502)
   at org.eclipse.osgi.framework.internal.core.Framework.suspendBundle(Framework.java:1067)
   at org.eclipse.osgi.framework.internal.core.StartLevelManager.decFWSL(StartLevelManager.java:619)
   at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:283)
   at org.eclipse.osgi.framework.internal.core.StartLevelManager.shutdown (StartLevelManager.java:256)
   at org.eclipse.osgi.framework.internal.core.SystemBundle.suspend(SystemBundle.java:190)
   at org.eclipse.osgi.framework.internal.core.Framework.shutdown(Framework.java:537)
   at org.eclipse.osgi.framework.internal.core.OSGi.shutdown(OSGi.java:61)
   at org.eclipse.osgi.framework.internal.core.FrameworkCommandProvider._shutdown(FrameworkCommandProvider.java:214)
   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.osgi.framework.internal.core.FrameworkCommandInterpreter.execute(FrameworkCommandInterpreter.java:145)
   at org.eclipse.osgi.framework.internal.core.FrameworkConsole.docommand( FrameworkConsole.java:293)
   at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(FrameworkConsole.java:278)
   at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(FrameworkConsole.java :213)
   at java.lang.Thread.run(Thread.java:619)


I attached the test bundle for your reference.

On 10/21/06, Oleg Besedin < obesedin@xxxxxxxxxx> wrote:

Hi Jason,

The quick answer is that you need to stop your custom registry before org.eclipse.equinox.registry bundle is stopped.


Normally bundles are stopped in the reverse order of dependency, i.e., if a bundle MyBundle depends on the org.eclipse.equinox.registry, then MyBundle is stopped first on shutdown, then org.eclipse.equinox.registry. So, normally, you could put the code to stop your custom registry into MyBundle's activator#stop().


I *guess* that putting inappropriate bundle start levels could break the shutdown order.


Thanks,

Oleg



"Jason Hao" <jason.hao@xxxxxxxxx >
Sent by:
equinox-dev-bounces@xxxxxxxxxxx

10/20/2006 03:52 AM

Please respond to
Equinox development mailing list <
equinox-dev@xxxxxxxxxxx>


To
equinox-dev@xxxxxxxxxxx
cc
Subject
[equinox-dev] NPE from RegistryStrategyOSGI.onStop()







Hi all,

I'm working on a project which is based on OSGi and equinox. The project also includes equinox extension registry bundle. Since my extensions are defined in files which are not in side the bundles, I need to load these extensions into registry by IExtensionRegistry.addContribution() method. And addContribution() method needs the master token which is under control of equinox registry bundle and I can't get it, so I have to create my registry instead of using the default registry. Here are what I have done.

1.        
Add "-Declipse.createRegistry=false" into VM arguments. This will disable the default registry.
2.        
Create my extension registry component and register it with declarative service spec. In the activate() method I creat my OSGi strategy and registry. In the deactivate() method I call IExtensionRegistry.stop() method to stop the registry.
3.        
Start my application and the registry works well.
4.        
Shutdown the OSGi framework by typing "shutdown" command in the console. org.eclipse.core.internal.registry.osgi.Activator.stop () method is called and the bundle context is set to null. Then my registry deactivate() method is called. I got java.lang.NullPointerException from org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.onStop(RegistryStrategyOSGI.java :204) since the bundle context is null.
I wonder if there's any way I can work around. Thanks.

--
Best Regards,

Jason Hao
_______________________________________________
equinox-dev mailing list

equinox-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/equinox-dev


_______________________________________________
equinox-dev mailing list

equinox-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/equinox-dev





--
Best Regards,

Jason Hao [attachment "registry.test.zip" deleted by Simon J Archer/Raleigh/IBM]
_______________________________________________
equinox-dev mailing list
equinox-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/equinox-dev