Search code examples
apache-karafkaraf

Karaf 4.0.4: Custom distribution - karaf-maven-plugin


I am trying to build a custom distribution by adding eventadmin and scr features to startup features.

I have tried the following based on the official documentation at http://karaf.apache.org/manual/latest/developers-guide/custom-distribution.html.

I have created a new project with the following pom.xml:

<?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/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>org.jemz.jf.karaf</groupId>
<artifactId>jf-framework-karaf</artifactId>
<packaging>karaf-assembly</packaging>
<name>${project.artifactId}</name>

<dependencies>
    <dependency>
        <groupId>org.apache.karaf.features</groupId>
        <artifactId>framework</artifactId>
        <version>4.0.4</version>
        <type>kar</type>
    </dependency>

    <dependency>
        <groupId>org.apache.karaf.features</groupId>
        <artifactId>standard</artifactId>
        <version>4.0.4</version>
        <classifier>features</classifier>
        <type>xml</type>
        <scope>runtime</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.karaf.tooling</groupId>
            <artifactId>karaf-maven-plugin</artifactId>
            <version>4.0.4</version>
            <extensions>true</extensions>
            <configuration>
                <!-- no startupFeatures -->
                <startupFeatures>
                    <feature>eventadmin</feature>
                    <feature>scr</feature>
                </startupFeatures>

                <installedFeatures>
                </installedFeatures>
                <bootFeatures>
                    <feature>standard</feature>
                </bootFeatures>

                <excludedArtifactIds>
                    <artifactId>slf4j-api</artifactId>
                </excludedArtifactIds>
            </configuration>
        </plugin>
    </plugins>
</build>

Unfortunately when I run 'mvn install' it fails with:

[ERROR] Failed to execute goal org.apache.karaf.tooling:karaf-maven-plugin:4.0.4:assembly (default-assembly) on project jf-framework-karaf: Unable to build assembly: Unable to resolve root: missing requirement [root] osgi.identity; osgi.identity=scr; type=karaf.feature; filter:="(&(osgi.identity=scr)(type=karaf.feature))" -> [Help 1]

If I move the 'eventadmin'and 'scr' features to 'bootFeatures', although that is not what I originally wanted, the custom karaf distribution is assembled ok, but when I started it returns some exceptions as shown below:

jmartinez@archlinux-dev-64 target]$ ./jf-framework-karaf-3.0.0-SNAPSHOT/bin/karaf 
        __ __                  ____      
       / //_/____ __________ _/ __/      
      / ,<  / __ `/ ___/ __ `/ /_        
     / /| |/ /_/ / /  / /_/ / __/        
    /_/ |_|\__,_/_/   \__,_/_/         

  Apache Karaf (4.0.4)

Hit '<tab>' for a list of available commands
and '[cmd] --help' for help on a specific command.
Hit '<ctrl-d>' or type 'system:shutdown' or 'logout' to shutdown Karaf.

karaf@root()> org.apache.karaf.features.core[org.apache.karaf.features.internal.service.BootFeaturesInstaller] : Error installing boot features
org.apache.karaf.features.internal.util.MultiException: Error restarting bundles
    at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:848)
    at org.apache.karaf.features.internal.service.FeaturesServiceImpl.doProvision(FeaturesServiceImpl.java:1089)
    at org.apache.karaf.features.internal.service.FeaturesServiceImpl$1.call(FeaturesServiceImpl.java:985)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    Suppressed: org.osgi.framework.BundleException: Activator start error in bundle org.ops4j.pax.url.wrap [55].
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2276)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2144)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
        at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1199)
        at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:840)
        ... 6 more
    Caused by: java.lang.IllegalStateException: Unknown protocol: mvn
        at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:482)
        at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:474)
        at java.net.URL.toExternalForm(URL.java:922)
        at java.net.URL.toString(URL.java:908)
        at java.lang.ClassLoader.defineClassSourceLocation(ClassLoader.java:675)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:759)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.defineClass(BundleWiringImpl.java:2370)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2154)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1542)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1415)
        at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4468)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2221)
        ... 11 more
    Suppressed: org.osgi.framework.BundleException: Activator start error in bundle org.apache.felix.metatype [21].
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2276)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2144)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
        at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1199)
        at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:840)
        ... 6 more
    Caused by: java.lang.IllegalStateException: Unknown protocol: mvn
        at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:482)
        at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:474)
        at java.net.URL.toExternalForm(URL.java:922)
        at java.net.URL.toString(URL.java:908)
        at java.lang.ClassLoader.defineClassSourceLocation(ClassLoader.java:675)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:759)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.defineClass(BundleWiringImpl.java:2370)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2154)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1542)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1415)
        at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4468)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2221)
        ... 11 more
    Suppressed: org.osgi.framework.BundleException: Activator start error in bundle org.apache.karaf.services.eventadmin [45].
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2276)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:2144)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:998)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:984)
        at org.apache.karaf.features.internal.service.FeaturesServiceImpl.startBundle(FeaturesServiceImpl.java:1199)
        at org.apache.karaf.features.internal.service.Deployer.deploy(Deployer.java:840)
        ... 6 more
    Caused by: java.lang.IllegalStateException: Unknown protocol: mvn
        at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:482)
        at org.apache.felix.framework.URLHandlersStreamHandlerProxy.toExternalForm(URLHandlersStreamHandlerProxy.java:474)
        at java.net.URL.toExternalForm(URL.java:922)
        at java.net.URL.toString(URL.java:908)
        at java.lang.ClassLoader.defineClassSourceLocation(ClassLoader.java:675)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:759)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.defineClass(BundleWiringImpl.java:2370)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2154)
        at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1542)
        at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:79)
        at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:2018)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at org.apache.felix.framework.BundleWiringImpl.getClassByDelegation(BundleWiringImpl.java:1415)
        at org.apache.felix.framework.Felix.createBundleActivator(Felix.java:4468)
        at org.apache.felix.framework.Felix.activateBundle(Felix.java:2221)
        ... 11 more
The specified feature: 'standard' version '4.0.4' is already installed
The specified feature: 'scr' version '4.0.4' is already installed
The specified feature: 'eventadmin' version '4.0.4' is already installed
^C
karaf@root()> ^Dkaraf@root()>

Eventhough everything is installed and started ok. After a reboot all exceptions disappear and works fine.

My questions are:

  1. How can I make a custom distribution where eventadmin and scr
    features are started on boot (startup.properties)?
  2. How can I get rid of those exceptions on the first boot when eventadmin/scr features are set on bootFeatures?

As a side note I have been able to set a stable custom distribution as I want using the deprecated old style of Maven assembly, but It seems by far more ease to use the new way with karaf-maven-plugin.


Solution

  • Remove the runtime scope from the Karaf standard feature :

    <dependency>
        <groupId>org.apache.karaf.features</groupId>
        <artifactId>standard</artifactId>
        <version>4.0.4</version>
        <classifier>features</classifier>
        <type>xml</type>
    </dependency>
    

    this scope prevent some bundle, needed by eventadmin/scr, to be added to the startup stage. tbh, i don't clearly understand all the facet of the resolver used here with the different stage and profile to generate an assembly, but removing this scope make it work