I first encountered OSGi in 2006. The place I worked at that time had (prior to my hiring) selected OSGi as the platform for server side components.
The team I worked on extended this into the GUI space by creating an eclipse GEF-based IDE for data flows in the server system, where we integrated the server components into the eclipse instance for debugging. At that time it was a very promising technology, it was defined in a standard document that was actually readable, and it had (at that time, if memory serves me right) one complete free software implementation (eclipse equinox), two commercial implementations, and one free implementation (apache felix) just getting started. For my own part I was attracted to the lego building block possibilities of OSGi, and the fact that we were able to get the server components running inside eclipse and talking to eclipse GUI components by using OSGi services (even though what the server side components and eclipse used on top of OSGi services was very different). But... the problem with OSGi both then, and when I started looking at it back in 2013, was the practicalities in getting all bundle dependencies satisfied, and finding, and working around bundle version issues. In contrast to this, karaf has just worked for me (I took the plunge into learning karaf in the autumn of 2016). Or let me qualify that a little: since I started creating features for my own bundles, as a part of the maven build, karaf has just worked for me. So what I'm wondering, is: why is karaf so easy when everything before has been so hard? Is it because there is something magical in the feature resolution, compared to other way of starting OSGi runtimes? Or is it just that karaf comes prepackaged with features for the pax stuff (web, jdbc)? And that it is these prepackaged features that just works? Just some idle curiosity on a Sunday morning...:-) - Steinar