【问题标题】:Using Oracle driver in Karaf with Apache Camel SQL Component在 Karaf 中使用 Oracle 驱动程序和 Apache Camel SQL 组件
【发布时间】:2014-03-08 19:16:30
【问题描述】:

我正在尝试在 Apache Karaf 中使用 Oracle jdbc 6 驱动程序,但我遇到了一些困难。特别是,我正在尝试利用驱动程序通过 Camel SQL 组件访问我的数据库。

我的蓝图文件如下所示:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
        <property name="dataSourceName" value="XXXXX" />
        <property name="TNSEntryName" value="XXXXX" />
        <property name="DriverType" value="XXXXX" />
        <property name="user" value="XXXXX" />
        <property name="password" value="XXXXX" />
    </bean>

    <!-- configure the Camel SQL component to use the JDBC data source -->
    <bean id="sql" class="org.apache.camel.component.sql.SqlComponent">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="properties" class="org.apache.camel.component.properties.PropertiesComponent">
        <property name="location" value="file:${karaf.home}/etc/sqlStatements.properties" />
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
        <route id="metis123">
            <from uri="timer:foo?period=5000" />
            <to uri="sql:{{sql.check_rwos_update}}" id="sqlCheckRwosUpdate" />
            <to uri="log:com.hveiga?showAll=true" />
        </route>
    </camelContext> 
</blueprint>

当我将文件放入 Karaf 的 deploy 目录时,我收到以下异常:

org.osgi.service.blueprint.container.ComponentDefinitionException: Unable to instantiate components
...
Caused by: java.lang.NoClassDefFoundError: javax/sql/DataSource
...
Caused by: java.lang.ClassNotFoundException: javax.sql.DataSource not found by oracle.ojdbc6 [131]

所以似乎是 oracle 驱动程序无法找到某个类的问题。我使用 apache-felix maven 插件osgified oracle jar,但也许我做错了,MANIFEST.MF 文件丢失了一些东西。

知道我可能缺少什么吗?

【问题讨论】:

  • 你能解释一下你是怎么安装你的蓝图的吗?从新鲜的 karaf(哪个版本)开始。您肯定会以某种方式安装 oracle 驱动程序。
  • 要安装我的蓝图,我只需将 xml 和 oracle 驱动程序 jar 文件放到部署目录中。 Karaf 版本是 2.3.3。

标签: java sql osgi apache-camel apache-karaf


【解决方案1】:

您可能对我的karaf db tutorial 感兴趣。

简单地删除 db 驱动程序可能不起作用。我在那里描述使用 wrap: pax url 的协议。通过这种方式,驱动程序与 bnd 和默认设置捆绑在一起。因此,这可能已经为您提供了一个工作系统。对于生产使用,最好使用像 bgossit 描述的 maven 项目捆绑驱动程序。你会在servicemix bundles 找到很多这方面的例子。

【讨论】:

    【解决方案2】:

    我已通过在MANIFEST.MF 中添加以下行来解决我的问题:

    Import-Package: javax.sql, javax.naming, javax.management, org.ietf.jgss
    

    感谢大家的帮助!

    【讨论】:

      【解决方案3】:

      我不得不使用 Maven 将 Oracle 驱动程序类似地包装到一个包中。这就是我所拥有的可能会有所帮助的:

      Oracle 捆绑包:

      Export-Package: oracle.jdbc, oracle.jdbc.driver
      Import-Package: !javax.*, !oracle.*
      

      引用它的其他捆绑包只有 Import-Package: * 和 Maven 填充其余部分。

      【讨论】:

      • 感谢您的评论。我试过了,但我得到了:org.osgi.framework.BundleException: Unresolved constraint in bundle oracle.ojdbc6 [131]: Unable to resolve 131.1: missing requirement [131.1] osgi.wiring.package; (osgi.wiring.package=!javax.*)
      • 你在使用 maven bundle 插件吗?我预计它会在生成的清单中产生诸如“Ignore-Package:javax.sql”之类的设置。
      • Oracle jar 文件的 Manifest 文件中没有“Ignore-Package”。
      • 好吧,这很有趣。您可以尝试将它们作为 Ignore-Package 条目而不是带感叹号的 Import-Package 条目,或者如果您愿意,可以放弃这个想法,我不确定它是否也适合您,但认为值得一试...
      • 我会试一试,感谢您的帮助。今晚我将继续对此进行调查,如果找到解决方案,我将发布。再次感谢。
      猜你喜欢
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 2016-12-06
      • 1970-01-01
      相关资源
      最近更新 更多