OSGi's class loading model is a key aspect of its modularity, and it differs significantly from traditional Java class loading. Here's a breakdown of how it works:
Key Principles :
- Bundle Class Loaders:
- In OSGi, each bundle has its own class loader. This isolates bundles from each other, preventing class conflicts and allowing for different versions of the same library to coexist.
- This "class loader per bundle" approach is fundamental to OSGi's dynamic nature.
- Import and Export Packages:
- The
Import-Package
and Export-Package
headers in the MANIFEST.MF
file define the visibility of classes between bundles.
- Bundles explicitly declare which packages they export and which packages they import.
- This explicit declaration is crucial for OSGi's dependency management.
- Dynamic Resolution:
- OSGi resolves class dependencies dynamically at runtime.
- When a bundle needs a class from another bundle, the OSGi framework uses the
Import-Package
and Export-Package
information to locate the exporting bundle and delegate the class loading to its class loader.
- Class Loading Delegation:
- OSGi class loaders participate in a delegation model.
- When a bundle's class loader is asked to load a class, it first checks if the class is within its own bundle.
- If not, it checks if the class is in an imported package. If so, it delegates the loading to the exporting bundle's class loader.
- This mechanism ensures that dependencies are resolved correctly.
- Isolation:
- OSGi's class loading model provides strong isolation between bundles.
- This isolation prevents "class cast exceptions" and other issues that can arise when different versions of the same class are loaded in the same class space.