concept execution environment in category osgi

This is an excerpt from Manning's book OSGi in Action: Creating Modular Applications in Java.
The OSGi framework plays a central role when you create OSGi-based applications, because it’s the application’s execution environment. The OSGi Alliance’s framework specification defines the proper behavior of the framework, which gives you a well-defined API to program against. The specification also enables the creation of multiple implementations of the core framework to give you some freedom of choice; there are a handful of well-known open source projects, such as Apache Felix ( http://felix.apache.org/), Eclipse Equinox (www.eclipse.org/equinox/), and Knopflerfish (www.knopflerfish.org/). This ultimately benefits you, because you aren’t tied to a particular vendor and can program against the behavior defined in the specification. It’s sort of like the reassuring feeling you get by knowing you can go into any McDonald’s anywhere in the world and get the same meal!
Pay special attention to the previous sentence. It’s possible to install a bundle on a given execution environment even if it’s not compatible with it, but you won’t be able to resolve it unless its required execution environment matches the current one. This is tied to the bundle’s resolved state because it’s possible for the execution environment to change over time. For example, you may switch between different versions of Java on subsequent executions of the framework. This way, any cached bundles not matching the current execution environment will essentially be ignored.
A given framework implementation can claim to provide more than one execution environment, because in most cases the Java platform versions are backward compatible. It’s possible to determine the framework’s supported execution environments by retrieving the org.osgi.framework.executionenvironment property from Bundle-Context.getProperty().