Equinox is another implementation of OSGi specification. Can be used together with the NetBeans Runtime Container via the Netbinox subproject of the Netigso effort and it yields surprisingly good results (in spite Equinox not being ready for execution in modular environment and has own compatibility problems).
Recently I have upgraded my Netigso project to Felix 2.0. It took a while as I needed to find new tricks to convince Felix to do classloading the way I like. I had this working in 1.4 version, but as this was done via reflection, which is obviously not a public API of Felix, the new tricks were quite different than those used in 1.4 version.
Nevertheless, some people are asking for Equinox support in Netigso. I was a bit reluctant to start such project. My attitude towards OSGi is still not through-fully positive and thus I thought support for one OSGi container is enough. But today was Friday, there was nothing better to do, so I gave Equinox a try.
It is amusing to look at different implementation of the same API! Both Felix and Equinox are supposed to work the same, yet both are coded in quite a different way. While Felix seems to adhere to OSGi spec as close as possible, the Equinox is full of additional abstractions and hooks exposed as API for integrators. As a result I seem to be able to integrate Equinox into Netigso without any wild tricks (like using reflection). One of the available hooks is actually exactly what I need.
It seems to me that Equinox is not by itself an OSGi container. It is prefabricate made for others (Eclipse & co.) to create their own OSGi containers. This is quite a different approach compared to the one taken by the Felix. While Felix adheres to the spec, avoiding containerisms as much as possible, majority of Equinox are various API extensions to tweak or enrich the standard OSGi behaviour.
As a result Felix seems to be the right framework for those who start with modularity and want to be as close as possible to the OSGi specification (Glassfish comes to my mind). Equinox on the other hand is much more friendly to those who want to experiment with new technologies or already have some notion of modularity themselves and need to bridge it to OSGi. Just like I have to do in my Netigso sub-project.
 Upgrading Equinox
The Netbinox project (which provides the fastest OSGi container on the Earth for launching desktop applications) is based on top of Equinox. Originally I started with Equinox version 3.5, but recently some customers requested an upgrade to the newly released 3.5.2 version.
I am not doing any non-API tricks while using Equinox. I rely either on OSGi interfaces or Equinox extension hooks. No reflection, no access to implementation details, etc. As such I was expecting the upgrade to be as easy as dropping new version of equinox.jar into the system.
That was naive expectation. It was significantly more complex!
 Functional Incompatibility
My code needs to find out all packages in each bundle to optimize classloading. I started to use
Enumeration en = bundle.findEntries("", "", true);
and such code works quite fine with Felix and Equinox 3.5. However it does not work at all in Equinox 3.5.2!
What that implies? Well, the Equinox implementation is shaking like an amoeba. In one release something works, in other it does not. Shakes like this obviously complicate usage of such libraries due to increasing fear to upgrade. Upgradability is no longer guaranteed, it is associated with problems and additional tweaks. One needs to seek for a workaround (in my case I had to re-read the OSGi specification and adjust the code):
Enumeration en = bundle.findEntries("", null, true);
Now the code works in Felix and all versions of Equinox I am aware of. In spite of the workaround, there still remains a BackwardCompatibility problem in Equinox. Something that used to work (in old version and also different implementation of the same API) no longer works in newer versions.
One can pretend that this is not a problem - e.g. the OSGi specification does not prescribe behavior of empty string being passed in as second parameter. An answer like: you have not read the specification properly, would then be appropriate. But hey, I am clueless user of the API! It is not my job to read specs, it is my job to get my code run! And it used to run. Even on two different implementations!
One can also admit that this is a problem. In such case there shall be new test, preferably in a TCK, to ensure Equinox is not vulnerable to the amoeba effect. In today's email conversation Richard Hall confirmed that the spec seems to indicate empty string shall match nothing. Richard reported himself a bug, so next release of Felix will be functionally incompatible with its previous release too. And the Amoeba is shaking and shaking...
 Richard S. Hall said ...
I guess you are right (although there is always way to provide AlternativeBehaviors), it is better to follow the spec (especially if the TCK is improved to cover the case). On the other hand, this is not true containerism: the (mis)behavior was the same in Equinox 3.5 as well as in Felix. Otherwise I would find out I need to pass in null sooner.
--JaroslavTulach 18:03, 14 July 2010 (UTC)
 Richard S. Hall said ...
 Alex Blewitt said ...
Thanks for speaking up Alex. The title of my post was intentionally more radical than the content. All I wanted to point out is that Equinox (in contrast to Felix) is a meta framework. To turn it into actual OSGi framework you can apply various tweaking functions to it and thus obtain various OSGi frameworks. Obviously one of such tweaking functions can be identity (e.g. no change) yielding OSGi framework known as Equinox. But the meta capacity is something interesting and I wanted to point it out.
--JaroslavTulach 11:12, 12 October 2009 (UTC)