Integration testing framework for OSGi applications running in Apache Karaf containers
—
Installation and configuration of Karaf features from repositories during test setup. This capability enables comprehensive testing of feature-based OSGi applications by programmatically installing features and their dependencies in the test container.
Install Karaf features from feature repositories during test container startup.
/**
* Install features from a repository URL
* @param repositoryUrl URL to the features repository XML
* @param features Names of features to install
* @return Feature installation option
*/
public static KarafFeaturesOption features(String repositoryUrl, String... features);
/**
* Install features using a URL reference
* @param repositoryUrl URL reference to the features repository
* @param features Names of features to install
* @return Feature installation option
*/
public static KarafFeaturesOption features(UrlReference repositoryUrl, String... features);Usage Examples:
import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.*;
// Install features from Maven repository
Option webFeatures = features(
"mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"http", "jetty", "webconsole"
);
// Install custom features
Option customFeatures = features(
"mvn:com.example/example-features/1.0.0/xml/features",
"example-core", "example-rest"
);
// Install single feature
Option scrFeature = features(
"mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"scr"
);
// Using file URL for local features repository
Option localFeatures = features(
"file:///opt/features/my-features.xml",
"my-feature-1", "my-feature-2"
);Configuration option for feature installation with repository and feature management.
/**
* Feature installation option implementing both Option and UrlReference
*/
class KarafFeaturesOption implements Option, UrlReference {
public KarafFeaturesOption(String repositoryUrl, String... features);
public KarafFeaturesOption(UrlReference repositoryUrl, String... features);
public String[] getFeatures();
public String getURL(); // From UrlReference interface
}Usage Examples:
// Create and inspect features option
KarafFeaturesOption featuresOpt = features(
"mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"http", "jetty"
);
String[] installedFeatures = featuresOpt.getFeatures(); // ["http", "jetty"]
String repoUrl = featuresOpt.getURL(); // Repository URLStandard Apache Karaf features repository containing core OSGi and Karaf features:
// Standard features repository URL pattern
String standardFeatures = "mvn:org.apache.karaf.features/standard/{karaf-version}/xml/features";
// Common standard features
Option commonFeatures = features(standardFeatures,
"scr", // Declarative Services
"http", // HTTP Service
"jetty", // Jetty Web Server
"webconsole", // Web Management Console
"ssh", // SSH Shell
"management", // JMX Management
"scheduler", // Scheduler Service
"eventadmin", // Event Admin Service
"log", // Logging Service
"config", // Configuration Admin
"region", // Karaf Regions
"package", // Package Admin
"kar", // Karaf Archive
"wrap" // Bundle Wrap Service
);Apache Karaf enterprise features for advanced capabilities:
String enterpriseFeatures = "mvn:org.apache.karaf.features/enterprise/4.2.0/xml/features";
Option enterpriseFeatures = features(enterpriseFeatures,
"transaction", // JTA Transaction Manager
"jndi", // JNDI Service
"jms", // JMS Support
"jpa", // JPA Support
"application-without-isolation", // Application deployment
"obr" // OSGi Bundle Repository
);Spring framework integration features:
String springFeatures = "mvn:org.apache.karaf.features/spring/4.2.0/xml/features";
Option springFeatures = features(springFeatures,
"spring", // Spring Framework
"spring-aspects", // Spring AOP
"spring-instrument", // Spring Instrumentation
"spring-jdbc", // Spring JDBC
"spring-jms", // Spring JMS
"spring-struts", // Spring Struts Integration
"spring-web", // Spring Web
"spring-webmvc" // Spring Web MVC
);Install features in dependency order:
@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
// Install base features first
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"scr", "http", "log"),
// Then install dependent features
features("mvn:org.apache.karaf.features/enterprise/4.2.0/xml/features",
"transaction", "jndi"),
// Finally install application features
features("mvn:com.example/app-features/1.0.0/xml/features",
"app-core", "app-web")
};
}Install features from multiple repositories:
@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
// Karaf standard features
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"scr", "http", "webconsole"),
// Third-party features
features("mvn:org.apache.cxf.karaf/apache-cxf/3.2.0/xml/features",
"cxf-core", "cxf-jaxws"),
// Application features
features("mvn:com.example/example-features/1.0.0/xml/features",
"example-api", "example-impl")
};
}Install features based on test conditions:
private Option[] getFeatures() {
List<Option> options = new ArrayList<>();
// Always install base features
options.add(features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"scr", "log"));
// Conditionally install web features
if (isWebTest()) {
options.add(features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"http", "jetty", "webconsole"));
}
// Conditionally install enterprise features
if (isEnterpriseTest()) {
options.add(features("mvn:org.apache.karaf.features/enterprise/4.2.0/xml/features",
"transaction", "jpa"));
}
return options.toArray(new Option[0]);
}Most common pattern using Maven coordinates:
// Standard Maven GAV pattern
"mvn:groupId/artifactId/version/type/classifier"
// Examples
"mvn:org.apache.karaf.features/standard/4.2.0/xml/features"
"mvn:com.example/custom-features/1.2.3/xml/features"
"mvn:org.apache.cxf.karaf/apache-cxf/3.2.0/xml/features"Local feature repository files:
// Absolute file path
"file:///opt/karaf/features/custom-features.xml"
// Relative to project
"file://src/test/resources/test-features.xml"Remote feature repositories:
// HTTP URL
"http://example.com/features/my-features.xml"
// HTTPS URL
"https://repository.example.com/features/enterprise-features.xml"Combine feature installation with configuration management:
@Configuration
public Option[] config() {
return new Option[] {
karafDistributionConfiguration(),
// Configure feature repositories in features.cfg
editConfigurationFilePut(FeaturesCfg.REPOSITORIES,
"mvn:org.apache.karaf.features/standard/4.2.0/xml/features," +
"mvn:com.example/example-features/1.0.0/xml/features"),
// Configure boot features
editConfigurationFilePut(FeaturesCfg.BOOT,
"config,ssh,management"),
// Install additional features programmatically
features("mvn:org.apache.karaf.features/standard/4.2.0/xml/features",
"http", "webconsole")
};
}Feature installation operations may throw exceptions for:
Feature installation failures typically occur during container startup and will cause test failure with detailed error messages about missing dependencies or invalid feature definitions.
Install with Tessl CLI
npx tessl i tessl/maven-org-ops4j-pax-exam--pax-exam-container-karaf