OSGI sits on top of JVM and provides mechanisms for service management, component definition, execution, management and life cycle control of modules.
http://www.javacodegeeks.com/2012/01/osgi-introduction.html
Each bundle is a jar on deployment stage, containing at least an OSGi specific manifest definition (MANIFEST with specific headers) and some specific classes.
Sample MANIFEST (only Bundle-SymbolicName is mandatory):
Bundle-Name: Name Sounds Good and Appealing
Bundle-SymbolicName: unique.name.of.the.bundle.in.OSGi.ecosystem
Bundle-Description: Anything like to say about the bundle
Bundle-ManifestVersion: 1
Bundle-Version: 1.0.0
Bundle-Activator: us.elron.bundles.ours.BundleActivator
Export-Package: us.elron.bundles.ours.exported; version = "1.0.0"
Import-Package: us.elron.bundles.yours.exported; version = "1.3.0"
Bundle-SymbolicName: identify this bundle
Export-Package: java package wanted to be used by other bundles
Import-Package: java package that is needed for the execution of the current bundle
Bundle configuration:
dependencies
exposed parts
Classes
Activator
Services are exposed as interfaces and registered with an implementation that performs that interface.
System is run by the OSGi itself. Bundles is given configuration file with an order and the life cycle management is applied for each of the components with given order.