{scrollbar}

top

6.2. Custom distributions

As Karaf is an OSGi container, it's heavily used as the kernel of applications and middlewares.

You could require to construct your own Karaf distribution matching your requirements.
This custom distribution could contain:

Maven assembly

Basically a Karaf custom distribution is:
1. Uncompressing a standard Karaf distribution in a given directory.
2. Populating the system repo with your features.
3. Populating the lib directory with your branding or other system bundle jar files.
4. Overriding the configuration files in the etc folder.

These tasks could be performed using scripting, or more easily and portable, using Apache Maven and a set of Maven plugins.

For instance, the Maven POM could look like:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM http://maven.apache.org/xsd/maven-4.0.0.xsd"> <groupId>my.company</groupId> <artifactId>mycustom-karaf</artifactId> <version>1.0</version> <packaging>pom</packaging> <name>My Unix Custom Karaf Distribution</name> <properties> <karaf.version>2.1.3</karaf.version> </properties> <dependencies> <dependency> <groupId>org.apache.karaf</groupId> <artifactId>apache-karaf</artifactId> <version>${karaf.version}</version> <type>tar.gz</type> </dependency> <dependency> <groupId>org.apache.karaf</groupId> <artifactId>apache-karaf</artifactId> <version>${karaf.version}</version> <type>xml</type> <classifier>features</classifier> </dependency> </dependencies> <build> <resources> <resource> <directory>${project.basedir}/src/main/filtered-resources</directory> <filtering>true</filtering> <includes> <include>**/*</include> </includes> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <executions> <execution> <id>filter</id> <phase>generate-resources</phase> <goals> <goal>resources</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>org.apache.karaf.tooling</groupId> <artifactId>features-maven-plugin</artifactId> <version>${karaf.version}</version> <executions> <execution> <id>add-features-to-repo</id> <phase>generate-resources</phase> <goals> <goal>add-features-to-repo</goal> </goals> <configuration> <descriptors> <descriptor>mvn:org.apache.karaf/apache-karaf/${karaf.version}/xml/features</descriptor> <descriptor>file:${project.basedir}/target/classes/my-features.xml</descriptor> </descriptors> <features> <feature>my-feature</feature> </features> </configuration> </execution> </executions> </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> <!-- Define here the artifacts which should be considered in the assembly --> <!-- For instance, the branding jar --> <artifactItems> <artifactItem> <groupId>my.groupId</groupId> <artifactId>my.branding.id</artifactId> <version>1.0</version> <outputDirectory>target/dependencies</outputDirectory> <destFileName>mybranding.jar</destFileName> </artifactItem> </artifactItems> </configuration> </execution> <execution> <!-- Uncompress the standard Karaf distribution --> <id>unpack</id> <phase>generate-resources</phase> <goals> <goal>unpack</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>org.apache.karaf</groupId> <artifactId>apache-karaf</artifactId> <type>tar.gz</type> <outputDirectory>target/dependencies</outputDirectory> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <executions> <execution> <id>bin</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <descriptors> <descriptor>src/main/descriptors/bin.xml</descriptor> </descriptors> <appendAssemblyId>false</appendAssemblyId> <tarLongFileMode>gnu</tarLongFileMode> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>

The Maven POM will download the Karaf standard distribution and prepares resources to be processed by the Maven assembly plugin.

Your Maven project structure should look like:

For instance, src/main/filtered-resources could contains:

The src/main/distribution contain all your custom Karaf configuration files and script, as, for examples:

Now, we can "assemble" our custom distribution using the Maven assembly plugin. The Maven assembly plugin uses an assembly descriptor in the src/main/descriptors/bin.xml:

<assembly> <id>bin</id> <formats> <format>tar.gz</format> </formats> <fileSets> <!-- Expanded Karaf Standard Distribution --> <fileSet> <directory>target/dependencies/apache-karaf-${karaf.version}</directory> <outputDirectory>/</outputDirectory> <excludes> <exclude>**/demos/**</exclude> <exclude>bin/**</exclude> <exclude>etc/system.properties</exclude> <exclude>etc/users.properties</exclude> <exclude>etc/org.apache.karaf.features.cfg</exclude> <exclude>etc/org.ops4j.pax.logging.cfg</exclude> <exclude>LICENSE</exclude> <exclude>NOTICE</exclude> <exclude>README</exclude> <exclude>RELEASE-NOTES</exclude> <exclude>karaf-manual*.html</exclude> <exclude>karaf-manual*.pdf</exclude> </excludes> </fileSet> <!-- Copy over bin/* separately to get the correct file mode --> <fileSet> <directory>target/dependencies/apache-karaf-${karaf.version}</directory> <outputDirectory>/</outputDirectory> <includes> <include>bin/admin</include> <include>bin/karaf</include> <include>bin/start</include> <include>bin/stop</include> </includes> <fileMode>0755</fileMode> </fileSet> <!-- Copy over jar files --> <fileSet> <directory>target/dependencies</directory> <includes> <include>my-custom.jar</include> </includes> <outputDirectory>/lib/</outputDirectory> </fileSet> <fileSet> <directory>src/main/distribution</directory> <outputDirectory>/</outputDirectory> <fileMode>0644</fileMode> </fileSet> <fileSet> <directory>target/classes/etc</directory> <outputDirectory>/etc/</outputDirectory> <lineEnding>unix</lineEnding> <fileMode>0644</fileMode> </fileSet> <fileSet> <directory>target/features-repo</directory> <outputDirectory>/system</outputDirectory> </fileSet> </fileSets> <files> <file> <source>${basedir}/target/dependencies/apache-karaf-${karaf.version}/bin/karaf</source> <outputDirectory>/bin/</outputDirectory> <destName>my-custom</destName> <fileMode>0755</fileMode> <lineEnding>unix</lineEnding> </file> <file> <source>${basedir}/target/classes/features.xml</source> <outputDirectory>/system/my.groupid/my-features/${project.version}</outputDirectory> <destName>my-features-${project.version}-features.xml</destName> <fileMode>0644</fileMode> <lineEnding>unix</lineEnding> </file> </files> </assembly>

To build you custom Karaf distribution, just do:

mvn install

You will find your Karaf custom distribution tar.gz in the target directory.

Roadmap

A distribution goal is in preparation in the next Karaf

Custom distribution examples

#top

{scrollbar}