无法加载JDBC驱动程序类

问题描述:

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

这是错误消息:

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)

.... 
<dependencies> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.6</version> 
    </dependency> 
    <dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc6</artifactId> 
     <version>11.2.0.3</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-pool</groupId> 
     <artifactId>commons-pool</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-core</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-blueprint</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.camel</groupId> 
     <artifactId>camel-jdbc</artifactId> 
     <version>${camel.version}</version> 
    </dependency> 
</dependencies> 
<build> 
    <defaultGoal>install</defaultGoal> 
    <plugins> 
     <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> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.5.1</version> 
      <configuration> 
       <source>1.8</source> 
       <target>1.8</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
.... 

p om.xml(功能)

.... 
<dependencies> 
    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.6</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>com.oracle</groupId> 
     <artifactId>ojdbc6</artifactId> 
     <version>11.2.0.3</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>commons-pool</groupId> 
     <artifactId>commons-pool</artifactId> 
     <version>1.4</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>commons-dbcp</groupId> 
     <artifactId>commons-dbcp</artifactId> 
     <version>1.4</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 
<build> 
    <defaultGoal>install</defaultGoal> 
    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>build-helper-maven-plugin</artifactId> 
      <version>1.8</version> 
      <executions> 
       <execution> 
        <id>attach-artifacts</id> 
        <phase>package</phase> 
        <goals> 
         <goal>attach-artifact</goal> 
        </goals> 
        <configuration> 
         <artifacts> 
          <artifact> 
           <file>target/features/features.xml</file> 
           <type>xml</type> 
           <classifier>features</classifier> 
          </artifact> 
         </artifacts> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 
    </plugins> 
</build> 
.... 

features.xml(功能)

.... 
<?xml version="1.0" encoding="UTF-8"?> 
<features name="myfeature" xmlns="http://karaf.apache.org/xmlns/features/v1.0.0"> 
    <repository>mvn:org.apache.karaf.assemblies.features/standard/2.3.0.redhat-60024/xml/features</repository> 
    <repository>mvn:org.apache.karaf.assemblies.features/enterprise/2.3.0.redhat-60024/xml/features</repository> 
    <repository>mvn:org.apache.cxf.karaf/apache-cxf/2.7.10/xml/features</repository> 
    <repository>mvn:org.apache.camel.karaf/apache-camel/2.12.3/xml/features</repository> 
    <repository>mvn:org.apache.activemq/activemq-karaf/5.8.0.redhat-60024/xml/features</repository> 
    <feature name="fer-cdr"> 
     <bundle>wrap:mvn:com.oracle/ojdbc6/11.2.0.3</bundle> 
     <bundle>wrap:mvn:mysql/mysql-connector-java/5.1.6</bundle> 
     <bundle>wrap:mvn:commons-dbcp/commons-dbcp/1.4</bundle> 
     <bundle>wrap:mvn:commons-pool/commons-pool/1.4</bundle> 
     <feature version="2.12.3">camel-core</feature> 
     <feature version="2.12.3">camel-blueprint</feature> 
     <feature version="2.12.3">camel-jdbc</feature> 
     <feature version="(3.1,4.0]">spring-jdbc</feature> 
     <bundle>mvn:com.project/jdbccamel/1.5.9</bundle> 
    </feature> 
</features> 
.... 

blueprint.xml(jdbccamel)

.... 
<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> 
.... 

我的发现: 当我maven-bundle-plugin中的import-package(请参阅jdbccamel中的pom.xml)

<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.apache.commons.dbcp.BasicDataSource类将不加载和我得到的消息是这样的:

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> 

它无法加载JDBC驱动程序l之前。

+0

[求助]问题是设置驱动程序类'oracle.jdbc.driver'而不是'oracle.jdbc.driver'。OracleDriver' – smftr

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

最简单的方法是使用OracleDataSource。在这种情况下,没有涉及类加载器的魔法,它应该工作。当您直接参考该课程时,您的软件包也会自动获得Import-Package语句。

更好的方法是使用pax-jdbc。 Pax-jdbc为大多数数据库提供包装,并帮助他们发布一个DataSourceFactory,这是OSGi标准来访问数据库。

Pax-jdbc-config允许通过使用普通配置从DataSourceFactory创建一个DataSource。它也允许使用多个池库。

有一个小例子,请看example。如果你不需要它,你可以省略liquibase部分。

+0

谢谢,这可能有助于未来 – smftr