- Create an offline version of Apache Karaf
- Configure karaf-maven-plugin and maven-dependency-plugin
- Override Karaf default behavior with Maven
The confirm this behavior empirically
mv ~/.m2 ~/.m2_save
And disable internet access.
If you start a new version of Karaf and try to install any feature such as
feature:install jndi
you will get the error message
Error executing command: Can't install feature jndi/0.0.0:
Error resolving artifact org.apache.xbean:xbean-naming:jar:3.18: Could not transfer artifact org.apache.xbean:xbean-naming:jar:3.18 from/to central (http://repo1.maven.org/maven2/): repo1.maven.org: nodename nor servname provided, or not known
If you turn internet access back on and rerun feature:install jndi, Karaf will create the directory ~/.m2/repository and put the library dependencies for Karaf jndi in that directory.
Follow the instructions below to create an offline version of Apache Karaf where the dependencies are preloaded at compile time and is not dependent on Maven.
This tutorial is based on Karaf 3.0.4 . The procedure for Karaf 2 and 4 are similar
Karaf 2: Coming Soon
Karaf 3: https://github.com/juttayaya/karaf/tree/master/karaf3/offline-karaf
Karaf 4: https://github.com/juttayaya/karaf/tree/master/karaf4/offline-karaf4
Step 1: Configure karaf-maven-plugin to generate an offline version of Karaf
Configure the setting ignoreDependencyFlag of karaf-maven-plugin to true. This configures the karaf-maven-plugin to download library dependencies into the directory ${karaf.home}/system
<plugin> <groupId>org.apache.karaf.tooling</groupId> <artifactId>karaf-maven-plugin</artifactId> <!-- Plugin requires at minimum 3.0.3 version for dependency=true bug fix https://issues.apache.org/jira/browse/KARAF-2596 --> <version>${karaf.plugin.version}</version> <extensions>true</extensions> <configuration> <karafVersion>${karaf.version}</karafVersion> <!-- ignoreDependencyFlag is true forces plugin to also download feature dependent libraries --> <ignoreDependencyFlag>true</ignoreDependencyFlag> </configuration> </plugin>
Step 2: Add the Karaf features.xml you want to install as dependencies.
For example, to add camel to Karaf, add this dependency
<!-- https://repo1.maven.org/maven2/org/apache/camel/karaf/apache-camel/2.15.2/apache-camel-2.15.2-features.xml --> <dependency> <groupId>org.apache.camel.karaf</groupId> <artifactId>apache-camel</artifactId> <version>${camel.version}</version> <classifier>features</classifier> <type>xml</type> <scope>runtime</scope> </dependency>
BootFeatures automatically begins on Karaf startup. InstalledFeatures just installs the library dependencies in the ${karaf.home}/system directory. The user will have to start it up manually via the command feature:install
For example, to start up camel at boot time but manually start up camel-quartz2
<bootFeatures> <feature>camel</feature> </bootFeatures> <installedFeatures> <feature>camel-quartz2</feature> </installedFeatures>
See https://github.com/juttayaya/karaf/blob/master/karaf3/offline-karaf/pom.xml for a full example.
Step 4: Add Maven repository http://svn.apache.org/repos/asf/servicemix/m2-repo
The dependency org.eclipse.equinox:region:jar:1.0.0.v20110506 for the "region" Karaf feature is not uploaded to the normal repo1.maven.org. Add this servicemix repository so Karaf can download the correct file
<repositories> <repository> <id>servicemix</id> <name>ServiceMix Repo for Karaf</name> <url>http://svn.apache.org/repos/asf/servicemix/m2-repo</url> </repository> </repositories>
Step 5: Configure Karaf not to use external Maven
Create file src/main/resources/etc/org.ops4j.pax.url.mvn.cfg and add the following lines
org.ops4j.pax.url.mvn.settings=${karaf.home}/etc/karaf_maven_settings.xml org.ops4j.pax.url.mvn.repositories=
This configures Karaf to not use the default Maven ~/.m2/settings.xml and not to try to download from any external Maven repositories like repo1.maven.org
See https://github.com/juttayaya/karaf/blob/master/karaf3/offline-karaf/src/main/resources/etc/org.ops4j.pax.url.mvn.cfg for a full example.
Create file src/main/resources/etc/karaf_maven_settings.xml with no Maven settings
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> </settings>
Step 6: Manually add any missing dependencies
Not all Karaf runtime dependencies are listed in features.xml (Probably a bug). We have to help offline Karaf by manually downloading the missing dependencies.
For example, https://repo1.maven.org/maven2/org/apache/karaf/features/standard/3.0.4/standard-3.0.4-features.xml is missing org.apache.karaf.jaas.boot.jar. To download it manually and put it in the ${karaf.home}/system directory, configure the maven-dependency-plugin
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy</id> <phase>generate-resources</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>org.apache.karaf.jaas</groupId> <artifactId>org.apache.karaf.jaas.boot</artifactId> <version>${karaf.version}</version> <outputDirectory> target/assembly/system/org/apache/karaf/jaas/org.apache.karaf.jaas.boot </outputDirectory> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin>
See https://github.com/juttayaya/karaf/blob/master/karaf3/offline-karaf/pom.xml for a full example.