commons-dbcp
pooling library and went on my merry way. But then, disaster struck: I got a dreaded ClassNotFound exception. "Can this be?" I thought... isn't OSGi supposed to shield me from class-loading hell and put some colour back into my graying hair?Delving in, I figured out what the issue was, and, I'm glad to say, the ServiceMix OSGi kernel was behaving exactly as it should. I had wrapped the commons-dbcp JAR without much thought: it turns out that code in the commons
org.apache.commons.dbcp.BasicDataSource
class (see below) is doing a Class.forName() call to load the oracle.jdbc.driver.OracleDriver
class.<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:BLAH"/>
<property name="username" value="blah"/>
<property name="password" value="blah"/>
<property name="maxActive" value="10"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
Now, OSGi bundles have to specify the packages they import using the
Import-Package
tag. That's all well and good if you know what these packages are in advance. Poor commons-dbcp
can't know in advance what kind of driver it should load, so Import-Package
just doesn't work here. Instead, you've got to allow the commons-dbcp
bundle to import anything: you can do this using the DynamicImport-Package
tag, setting it to DynamicImport-Package: *
. We're currently patching the
commons-dbcp
bundle on the ServiceMix bundle repository so that it includes the DynamicImport-Package: *
tag by default.