Search code examples
apache-camelosgiosgi-bundleapache-servicemix

NoClassDefFoundError: OsgiDefaultCamelContext using Apache ServiceMix


I created simple bundle:

public class Activator implements BundleActivator {

    private CamelContext camelContext;
    private CsvDataFormat csv = new CsvDataFormat();

    public void start(BundleContext bundleContext) throws Exception {
        csv.setDelimiter('|');
        csv.setQuoteDisabled(true);
        camelContext = new OsgiDefaultCamelContext(bundleContext);
        camelContext.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("file://./in/csv?charset=windows-1251")
                        .unmarshal(csv)
                        .process(exchange -> {
                          //do smth
                        });

            }
        });
        camelContext.start();
    }

    public void stop(BundleContext bundleContext) throws Exception {
        camelContext.stop();
    }
}

I using Apache ServiceMix. I install bundles:

karaf@root>feature:install camel-csv
karaf@root>bundle:install -s mvn:org.apache.camel/camel-core-osgi/2.16.5

But, when I start my bundle, I have error:

Caused by: java.lang.NoClassDefFoundError: org/apache/camel/core/osgi/OsgiDefaultCamelContext
    at ru.camel.csv.Activator.start(Activator.java:19)

But why? In karaf console I see:

222 | Active    |  50 | 2.16.5                             | camel-csv
223 | Active    |  50 | 1.1.0                              | Apache Commons CSV
224 | Resolved  |  80 | 1.0.0.SNAPSHOT                     | csv
228 | Active    |  80 | 2.16.5                             | camel-core-osgi

Bundle camel-core-osgi contains class OsgiDefaultCamelContext. Why I get this error?

My 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/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ru.camel</artifactId>
        <groupId>ru.camel.test</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>csv</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core-osgi</artifactId>
            <version>2.16.5</version>
        </dependency>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>6.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-csv</artifactId>
            <version>2.16.5</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <inherited>true</inherited>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <executions>
                    <execution>
                        <id>osgi-bundle</id>
                        <goals>
                            <goal>bundle</goal>
                        </goals>
                        <phase>package</phase>
                        <configuration>
                            <instructions>
                                <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
                                <Bundle-Version>${project.version}</Bundle-Version>
                                <Import-Package>org.apache.camel.core.osgi.OsgiDefaultCamelContext</Import-Package>
                                <Bundle-Activator>ru.camel.csv.Activator</Bundle-Activator>
                            </instructions>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Solution

  • You should check the imports of your bundle.

    Every bundle has to declare which packages (classes) it wants to import. Your bundle probably did not declare to import the package OsgiDefaultCamelContext is in.

    Imports are defined in the META-INF/MANIFEST.MF of your bundle. Depending on your build tool this file might be created automatically during the build. Otherwise, you have to write that yourself, although I would highly recommend looking at a tool that does this automatically during the build.

    In your pom.xmlchange the configuration of the Import-Package statement of the maven-bundle-plugin to:

    <Import-Package>org.apache.camel.core.osgi.*;*</Import-Package>