12.2. FABs and Features
Overview
FABs have been designed to integrate smoothly with Apache Karaf features. Although there is some overlap in the capabilities of FABs and features, FABs cannot replace features completely. There are some cases, involving third-party dependencies, where figuring out the correct set of dependencies is inherently difficult and unavoidably it remains a manual process. Features remain the ideal mechanism for encapsulating these kinds of hand-crafted dependencies.
Requiring features
A FAB can be configured to require specific features, so that the required features are automatically installed at deploy time. For details of how to configure this, see the section called “Requiring features”.
Automatic feature detection
Automatic feature detection is a special case of requiring features. When the FAB runtime scans an embedded
pom.xml
file, it automatically maps certain Maven dependencies to features and installs the corresponding feature instead of the Maven dependency.
For example, if the FAB runtime finds a Maven dependency on the
org.apache.camel/camel-jetty
artifact, it will automatically install the camel-jetty
feature.
Respecting features
The basic FAB model of deployment is rather aggressive: the FAB runtime walks the tree of Maven transitive dependencies, installing (and if necessary, also downloading) all of the dependencies that it finds along the way. This deployment model must be softened, however, if FABs are to integrate properly with features.
Features are manually constructed deployment units and, in many cases, they include combinations of bundles that an automated tool would never be able to figure out. For this reason, it is better if the FAB runtime respects the judgement of the developer who constructed the feature and does not try to install dependencies for bundles belonging to a feature. To avoid clobbering feature dependencies, the FAB runtime applies the following rule: by default, FAB does not try to install dependencies for a provided bundle, if that bundle is already installed.
This rule ensures that the FAB runtime does not try to second-guess the dependencies installed by a feature.