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


The package org.eclipse.core.runtime package is split.  The following Require-Bundle header should have given you all the access you needed to the extension registry classes:

Require-Bundle: org.eclipse.equinox.registry

From the stack trace it looks more like the org.eclipse.equinox.registry bundle was shutdown before your bundle had a chance to shutdown.  Currently Equinox will shutdown all lazy-start bundles before "normal" bundles are shutdown.  Since org.eclipse.equinox.registry is lazy-started that means it is guaranteed to be shutdown before your registry.test bundle.  Equinox will not let a class be loaded from a lazy-start bundle if it is already shutdown.  One way to work around this issue is to make your registry.test bundle a lazy-start bundle (by adding the "Eclipse-LazyStart: true" header).  This will ensure your bundle is shutdown before the org.eclipse.equinox.registry bundle because it depends on the org.eclipse.equinox.registry bundle.

In the current 3.3 release we are looking to improve the lazy-start specification.  One improvement is in the area of shutdown order.  This would prevent the need to specify Eclipse-LazyStart in your bundle simply because you depend on a lazy-start bundle.  For reference bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=135885 is tracking the lazy-start changes we are planning for the 3.3 release.

Tom



Simon J Archer/Raleigh/IBM@IBMUS
Sent by: equinox-dev-bounces@xxxxxxxxxxx

10/22/2006 10:11 PM

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

To
Equinox development mailing list <equinox-dev@xxxxxxxxxxx>
cc
"Equinox development mailing list" <equinox-dev@xxxxxxxxxxx>, equinox-dev-bounces@xxxxxxxxxxx
Subject
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

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