The "OSGi way" is to develop separate bundles containing discrete, coherent pieces of functionality. Sometimes these bundles contain utility classes, sometimes they depend on utility classes and set up their own OSGi Services.
Users, on the other hand, are unlikely to be exposed to bundles. They care more about the application, a piece of software that performs a task or solves their problem. Normally an application will use multiple bundles (say, imported via Import-Package) to perform its tasks.
What is the best way to formalise this relationship in the OSGi world? One example requirement would be something as simple as showing the current version number of the application (not the bundle(s)) to to the user. How would this version number be discovered?
Eclipse has a concept called 'features' but this is not OSGi standard.
Peter Kriens has written about OSGi applications and his article makes sense. My take away from it was that an application can map to a bundle; it's just that the bundle uses other bundles in some way. But if one is to create an application bundle using Import-Package, I don't see how that can be feasible from a development point of view.
One way may be to have an 'application bundle' that uses Require-Bundle and has its own version, but Require-Bundle is frowned up in the OSGi world.
Using Import-Package to import all the required packages with the required versions, however, adds a significant maintenance overhead to the developer to the extent that I don't think it's feasible. Each time the smallest change is made, even to an implementation package, the package version must be updated, and then the dependency on the package version updated in the 'application bundle'.