Question

I have a problem which I just cannot seem to solve on my own. If have an OSGI Bundle which uses blueprint for instantiation of the Objects which should be deployed to Karaf 3.0.0. The problem is, that ClassNotFoundExceptions keep bothering me, allthough the corresponding jars are located in the bundles jar. This is 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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.kneipenapp</groupId>
    <artifactId>web-service</artifactId>
    <name>WebService</name>
    <version>0.0.1</version>
    <packaging>bundle</packaging>

    <dependencies>

        <!-- Database connection -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>2.0</version>
        </dependency>

        <dependency>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
            <version>2.2</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-driver</artifactId>
            <version>5.1.29</version>
        </dependency>

        <!-- Camel -->
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-blueprint</artifactId>
            <version>2.13.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
            <version>2.13.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-sql</artifactId>
            <version>2.13.0</version>
            <scope>provided</scope>
        </dependency>

        <!-- Http Handler exposing -->
        <dependency>
            <groupId>org.glassfish.grizzly</groupId>
            <artifactId>grizzly-http</artifactId>
            <version>2.3.11</version>
            <scope>provided</scope>
        </dependency>

        <!-- Jersey -->
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.7</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Embed-Dependency>
                            *;scope=compile|runtime
                        </Embed-Dependency>
                        <Import-Package>
                            !*,
                            org.glassfish.grizzly.http,
                            org.apache.camel.component.sql,
                            org.osgi.framework
                        </Import-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

This is one of my blueprint xml files (this one is causing the ClassNotFoundException):

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <!-- The camel context which will hold the routes -->
    <camelContext id="context" xmlns="http://camel.apache.org/schema/blueprint">
        <routeContextRef ref="newElementContext"/>
    </camelContext>

    <!-- The OSGI service beans which will be used to publish the service through the Grizzly Http Server -->

    <bean id="endpoint" class="org.glassfish.jersey.server.internal.RuntimeDelegateImpl" factory-method="getInstance">
        <argument index="0" ref="endpointImplementation"/>
        <argument index="1" value="org.glassfish.grizzly.HttpHandler"/>
    </bean>

    <bean id="endpointImplementation" class="com.kneipenapp.service.ServiceEndpoint">
        <argument index="0" ref="context"/>
    </bean>

    <!-- The pooled connection -->
    <bean id="connectionFactory" class="org.apache.commons.dbcp2.DriverManagerConnectionFactory">
        <argument index="0" value="{{connection.url}}"/>
        <argument index="1" value="sqluser"/>
        <argument index="2" value="sqluserpw"/>
    </bean>

    <bean id="pooledSQLConnectionFactory" class="PooledSqlConnectionFactory">
        <argument index="0" ref="connectionFactory"/>
        <argument index="1" value="com.mysql.jdbc.Driver"/>
    </bean>

    <bean id="poolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
        <property name="maxTotal" value="{{pool.maxConnections}}"/>
        <property name="maxIdle" value="{{pool.maxIdleConnections}}"/>
        <property name="minIdle" value="{{pool.minimumIdleConnections}}"/>
        <property name="maxWaitMillis" value="{{pool.waitInterval}}"/>
    </bean>

    <bean id="connectionPool" class="org.apache.commons.pool2.impl.GenericObjectPool">
        <argument index="0" ref="pooledSQLConnectionFactory"/>
        <argument index="1" ref="poolConfig"/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp2.PoolingDataSource">
        <argument index="0" ref="connectionPool"/>
    </bean>

    <!-- The SQL endpoint used by the route -->
    <bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
        <property name="dataSource" ref="dataSource"/>
    </bean>

</blueprint>

Finally this is the Exception and Stacktrace I recieve when I try to start the bundle:

org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to load class PooledSqlConnectionFactory from recipe BeanRecipe[name='pooledSQLConnectionFactory']
    at org.apache.aries.blueprint.di.AbstractRecipe.doLoadType(AbstractRecipe.java:195)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe.loadType(AbstractRecipe.java:161)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.loadClass(BeanRecipe.java:249)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.getType(BeanRecipe.java:895)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:323)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:806)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[4:org.apache.aries.blueprint.core:1.3.0]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_25]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:268)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:806)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[4:org.apache.aries.blueprint.core:1.3.0]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_25]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:268)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:806)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[4:org.apache.aries.blueprint.core:1.3.0]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_25]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.RefRecipe.internalCreate(RefRecipe.java:62)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:106)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.setProperty(BeanRecipe.java:933)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:907)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.setProperties(BeanRecipe.java:888)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate2(BeanRecipe.java:820)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BeanRecipe.internalCreate(BeanRecipe.java:787)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe$1.call(AbstractRecipe.java:79)[4:org.apache.aries.blueprint.core:1.3.0]
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)[:1.7.0_25]
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)[:1.7.0_25]
    at org.apache.aries.blueprint.di.AbstractRecipe.create(AbstractRecipe.java:88)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintRepository.createInstances(BlueprintRepository.java:245)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintRepository.createAll(BlueprintRepository.java:183)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.instantiateEagerComponents(BlueprintContainerImpl.java:681)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.doRun(BlueprintContainerImpl.java:378)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.run(BlueprintContainerImpl.java:269)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:276)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintExtender.createContainer(BlueprintExtender.java:245)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintExtender.modifiedBundle(BlueprintExtender.java:235)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:500)[2:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.customizerModified(BundleHookBundleTracker.java:433)[2:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$AbstractTracked.track(BundleHookBundleTracker.java:725)[2:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$Tracked.bundleChanged(BundleHookBundleTracker.java:463)[2:org.apache.aries.util:1.1.0]
    at org.apache.aries.util.tracker.hook.BundleHookBundleTracker$BundleEventHook.event(BundleHookBundleTracker.java:422)[2:org.apache.aries.util:1.1.0]
    at org.apache.felix.framework.util.SecureAction.invokeBundleEventHook(SecureAction.java:1103)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.util.EventDispatcher.createWhitelistFromHooks(EventDispatcher.java:695)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:483)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4403)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2092)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1247)[16:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1219)[16:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1208)[16:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:503)[16:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)[16:org.apache.felix.fileinstall:3.2.6]
Caused by: java.lang.ClassNotFoundException: PooledSqlConnectionFactory not found by com.kneipenapp.web-service [80]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)[org.apache.felix.framework-4.2.1.jar:]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)[:1.7.0_25]
    at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1844)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:937)[org.apache.felix.framework-4.2.1.jar:]
    at org.apache.aries.blueprint.container.BlueprintContainerImpl.loadClass(BlueprintContainerImpl.java:432)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.BlueprintRepository.loadClass(BlueprintRepository.java:410)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.container.GenericType.parse(GenericType.java:113)[4:org.apache.aries.blueprint.core:1.3.0]
    at org.apache.aries.blueprint.di.AbstractRecipe.doLoadType(AbstractRecipe.java:168)[4:org.apache.aries.blueprint.core:1.3.0]
    ... 63 more

If someone has a clue how this could be solved, I'd be more than happy to hear it

Greetings, Pascal

Was it helpful?

Solution

Maybe, you should use full qualified class name including the package name while specifying class parameter of the bean element. Like in the 'connectionFactory' bean above the 'pooledSQLConnectionFactory'.

OTHER TIPS

Your connectionPool is created by the constructor

public GenericObjectPool(PooledObjectFactory < T > factory, GenericObjectPoolConfig config) {...}

is your class="PooledSqlConnectionFactory" implementing PooledObjectFactory < T > from commons-pool2 or extending BasePooledObjectFactory < T > with correct overrides, constructor etc?

You have to check if the arguments you give ( pooledSQLConnectionFactory and poolConfig ) are compliant with constuctor for org.apache.commons.pool2.impl.GenericObjectPool

Also, I don't know about Apache Aries, but maybe you also check how it works with Generics.
See https://issues.apache.org/jira/browse/ARIES-960
and https://issues.apache.org/jira/browse/ARIES-834

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top