Apache camel Can';无法加载JDBC驱动程序类

Apache camel Can';无法加载JDBC驱动程序类,apache-camel,osgi,jbossfuse,Apache Camel,Osgi,Jbossfuse,我在JBoss Fuse服务器中创建了一个简单的Apache Camel应用程序。 我的骆驼蓝图无法读取驱动程序类 这是错误消息: org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver' ... Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver from bundle 144 (fer-

我在JBoss Fuse服务器中创建了一个简单的Apache Camel应用程序。 我的骆驼蓝图无法读取驱动程序类

这是错误消息:

org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver'
...
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver from bundle 144 (fer-cdr)
... 
Caused by: java.lang.ClassNotFoundException: oracle.jdbc.driver not found by jdbccamel
... 
这是项目结构:

+-- Root
+== pom.xml
+-- jdbccamel (Maven Module)
|   +-- pom.xml
|   +-- /src/main/resources/OSGI-INF/blueprint/blueprint.xml
+-- features (Maven Modul => contains fabric feature of the project)
|   +-- pom.xml
|   +-- scr/main/resources/features.xml
pom.xml(jdbccamel)

当我同时添加这两项时,如下所示:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>${version.maven-bundle-plugin}</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            <Include-Resource>{maven-resources}</Include-Resource>
        </instructions>
    </configuration>
</plugin>
org.osgi.service.resolver.ResolutionException: Unable to resolve dummy/0.0.0: missing requirement [dummy/0.0.0] osgi.identity; osgi.identity=jdbccamel; type=karaf.feature; version=0 [caused by: Unable to resolve jdbccamel/0.0.0: missing requirement [jdbccamel/0.0.0] osgi.identity; osgi.identity=jdbccamel; type=osgi.bundle; version="[1.5.9,1.5.9]" [caused by: Unable to resolve jdbccamel/1.5.9: missing requirement [jdbccamel/1.5.9] osgi.wiring.package; filter:="(osgi.wiring.package=org.apache.commons.dbcp.BasicDataSource)"]]
  at org.apache.felix.resolver.Candidates.populateResource(Candidates.java:285)
  at org.apache.felix.resolver.Candidates.populate(Candidates.java:153)
  at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:148)
  at io.fabric8.agent.DeploymentBuilder.resolve(DeploymentBuilder.java:231)
  at io.fabric8.agent.DeploymentAgent.doUpdate(DeploymentAgent.java:567)
  at io.fabric8.agent.DeploymentAgent$2.run(DeploymentAgent.java:293)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
  at java.util.concurrent.FutureTask.run(FutureTask.java:262)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  at java.lang.Thread.run(Thread.java:745)
<Import-Package>oracle.jdbc.driver,org.apache.commons.dbcp.BasicDataSource</Import-Package>
oracle.jdbc.driver,org.apache.commons.dbcp.BasicDataSource

它不能像以前那样加载JDBC驱动程序。

这在OSGi中不起作用。BasicDataSource尝试使用自己的类加载器解析oracle类,该类加载器没有看到这些类

最简单的方法是使用。在这种情况下,不涉及类加载器魔术,它应该可以工作。当您直接引用该类时,您的包还将自动获取导入包语句

更好的方法是使用paxjdbc。Pax jdbc为大多数数据库提供包装器,并帮助它们发布DataSourceFactory,这是访问数据库的OSGi标准

允许使用普通配置从DataSourceFactory创建数据源。它还允许使用多个池库


关于一个小例子,请参见。如果不需要,您可以省略liquibase部分。

[已解决]问题是设置驱动程序类
oracle.jdbc.driver
,而不是
oracle.jdbc.driver.OracleDriver
....
<bean class="org.apache.commons.dbcp.BasicDataSource" id="dataSource">
    <property name="driverClassName" value="oracle.jdbc.driver" />
    <property name="url" value="${cdr.url}" />
    <property name="username" value="${cdr.username}" />
    <property name="password" value="${cdr.password}" />
    <property name="initialSize" value="${cdr.initialSize}" />
    <property name="maxActive" value="${cdr.maxActive}" />
    <property name="testOnBorrow" value="${cdr.testOnBorrow}" />
    <property name="validationQuery" value="${cdr.validationQuery}" />
</bean>
....
<Import-Package>oracle.jdbc.driver</Import-Package>
<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>${version.maven-bundle-plugin}</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
            <Include-Resource>{maven-resources}</Include-Resource>
        </instructions>
    </configuration>
</plugin>
org.osgi.service.resolver.ResolutionException: Unable to resolve dummy/0.0.0: missing requirement [dummy/0.0.0] osgi.identity; osgi.identity=jdbccamel; type=karaf.feature; version=0 [caused by: Unable to resolve jdbccamel/0.0.0: missing requirement [jdbccamel/0.0.0] osgi.identity; osgi.identity=jdbccamel; type=osgi.bundle; version="[1.5.9,1.5.9]" [caused by: Unable to resolve jdbccamel/1.5.9: missing requirement [jdbccamel/1.5.9] osgi.wiring.package; filter:="(osgi.wiring.package=org.apache.commons.dbcp.BasicDataSource)"]]
  at org.apache.felix.resolver.Candidates.populateResource(Candidates.java:285)
  at org.apache.felix.resolver.Candidates.populate(Candidates.java:153)
  at org.apache.felix.resolver.ResolverImpl.resolve(ResolverImpl.java:148)
  at io.fabric8.agent.DeploymentBuilder.resolve(DeploymentBuilder.java:231)
  at io.fabric8.agent.DeploymentAgent.doUpdate(DeploymentAgent.java:567)
  at io.fabric8.agent.DeploymentAgent$2.run(DeploymentAgent.java:293)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
  at java.util.concurrent.FutureTask.run(FutureTask.java:262)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  at java.lang.Thread.run(Thread.java:745)
<Import-Package>oracle.jdbc.driver,org.apache.commons.dbcp.BasicDataSource</Import-Package>