【问题标题】:creating OSGi enabled jar for ORACLE (for Spring Roo - ORACLE db integration)为 ORACLE 创建启用 OSGi 的 jar(用于 Spring Roo - ORACLE db 集成)
【发布时间】:2011-11-10 22:33:10
【问题描述】:

我遇到了 Spring Roo / Oracle OSGi 驱动程序问题,许多其他人已经遇到并且似乎已经解决了。

“Springsource 当前无法托管 OSGi 包装的 Oracle 驱动程序”,因此看来您需要将现有的非 OSGi 包装起来。

我一直在按照步骤 here 使用 Oracle 11g 驱动程序,版本 2 的驱动程序。

第 11 步完全卡住了,

  1. 从 Felix 存储库中删除有故障的 OSGI 驱动程序:
    • 使用“osgi ps”检索要删除的 OSGI 包的 ID。
    • 使用“osgi headers”获取对应 OSGI 包的 Bundle-SymbolicName。可能是com.oracle.roo.jdbc.ojdbc5com.oracle.roo.jdbc.ojdbc6
    • 使用osgi uninstall –bundleSymbolicName com.oracle.roo.jdbc.ojdbcx

我完全没有使用 osgi 的背景,尽管在您运行时得到了 com.sun.security.auth.module 缺少的依赖项:

roo> database reverse engineer --shema xxx

无法通过 osgi 阶段从 OSGi 卸载这些依赖项。

任何人都可以通过控制台转储执行此操作的命令,尽管点头。

非常感谢 - Roo 允许快速构建基本应用程序,但 roo-oracle 与其他所有应用程序的易用性和速度相比简直就是悬崖。

【问题讨论】:

    标签: spring oracle osgi


    【解决方案1】:
    NOTE: "CMD>" indicates from the command prompt, "roo>" indicates from within the roo shell, which can be accessed from the command prompt, by typeing "roo", provided the roo binary in on the environment path.     
    

    为了解决这个问题,我做了: 在带有 oracle jar 文件的目录中:

    [1] CMD> mvn install:install-file -Dfile=ojdbc5-11.2.0.2.jar -DgroupId=com.oracle -DartifactId=ojdbc5 -Dversion=11.2.0.2 -Dpackaging=jar
    
    [2] start roo, and run:
    roo> addon create wrapper --topLevelPackage com.oracle.roo.JDBC --groupId com.oracle --artifactId ojdbc5 --version 11.2.0.2 --vendorName Oracle --licenseUrl http://www.oracle.com
    
    [3] need to remove some dependencies from the generated file (com.oracle.roo.jdbc.ojdbc5-11.2.0.2.0001.jar in this case), open jar in 7zip or other and edit manifest.MF file and remove from the "Import-Package:" bit in MINIFEST.MF:
    com.sun.security.auth.module
    oracle.i18n.text,
    oracle.i18n.text.converter
    oracle.ons,oracle.security.pki
    
    [4] install the following dependencies (get from http://ebr.springsource.com/repository/app/, search on this site for the groupIds below) into mvn:
    
    CMD> mvn install:install-file -Dfile=com.springsource.javax.resource-1.5.0.jar -DgroupId=javax.resource -DartifactId=com.springsource.javax.resource -Dversion=1.5.0 -Dpackaging=jar
    
    CMD> mvn install:install-file -Dfile=com.springsource.javax.transaction-1.1.0.jar -DgroupId=javax.transaction -DartifactId=com.springsource.javax.transaction -Dversion=1.1.0 -Dpackaging=jar
    
    CMD> mvn install:install-file -Dfile=ojdbc5.jar -DgroupId=com.oracle -DartifactId=ojdbc5 -Dversion=11.2.0.2 -Dpackaging=jar
    
    [5] in roo, run
    
    roo> osgi install --url file:///c:\users\alex\com.springsource.javax.transaction-1.1.0.jar
    roo> osgi install --url file:///c:\users\alex\com.springsource.javax.resource-1.5.0.jar
    roo> osgi install --url file:///c:\path\to\current\dir\oracle\file_generated_by_wrapper.jar
    
    
    [6] to check these files have made it ok type 
    
    roo> osgi ps
    
    gives:
    
    [  62] [Active     ] [    1] Spring Roo - Wrapping - jline (0.9.94.0010)
    [  63] [Active     ] [    1] Spring Roo - Wrapping - json-simple (1.1.0.0010)
    [  64] [Active     ] [    1] Spring Roo - Wrapping - protobuf-java-lite (2.3.0.0001)
    [  65] [Active     ] [    1] Spring User Agent Analysis - Client (1.0.2.RELEASE)
    [  69] [Active     ] [    1] Java Resource API (1.5.0)
    [  70] [Active     ] [    1] com-oracle-roo-jdbc (11.2.0.2_0001)
    [  72] [Installed  ] [    1] Java Transaction API (1.1.0)
    
    basically 'Active' is what you want - 
    
    run:
    
    roo> osgi start --url file:///c:\users\alex\com.springsource.javax.transaction-1.1.0.jar
    
    to change 'Installed' to 'Active'
    
    [7] in roo, run:
    roo> database reverse engineer --schema <schema>
    
    if you get a 'Framework error' then you need to open up the manifest of your jar and delete more oracle imports (the above list *should* be sufficient) - only remove from the imports section tho.
    
    once you've changed the jar, reload into OSGi with:
    
    roo> osgi uninstall --bundleSymbolicName com.oracle.roo.jdbc.ojdbc5
    roo> osgi start --url  file:///c:\users\alex\com.oracle.roo.jdbc.ojdbc5-11.2.0.2.0001.jar
    
    re-run:
    
    roo> database reverse engineer --schema <schema> 
    
    to verify. Add a table into the schema and get DBA to grant access to get stuff to actually be generated. 
    

    【讨论】:

    • 我注意到我当前的问题是 Roo 一直在提取 10g 而不是 11g 库导入 - 目前正在努力寻找 roo 是如何做到这一点的。还得到 'java.lang.IllegalStateException: java.lang.IllegalArgumentException: Unable to get physical type metadata for type' when doing 'roo>field string --fieldName transactionId --notNull' 所以 roo-oracle 集成不在家和干跨度>
    • Got Roo 使用 oracle - 需要导入资源和事务(与上面的 mvn 导入匹配),一个用于 oracle ojdbc5 jar,一个用于新生成的 osgi jar,确保 DBA 已授予对象创建权限权限(在用户表上?)和 Roo 应该开始工作。 (我将修改帖子以包含所需的 pom.xml 导入 - 星期一)
    • 我还必须删除 oracle.xdb 的导入。但在那之后它起作用了。
    • 我不得不删除更多,我失去了踪迹,还有几个 oracle 和 sun jar。此外,似乎从 roo 1.2.5 开始提供 javax.transaction 依赖项,包括导致多个依赖项链错误的附加依赖项。
    【解决方案2】:

    我的帖子 (http://nidget.wordpress.com/2011/07/21/how-to-osgify-an-oracle-jdbc-driver-with-spring-roo/) 中提到的命令是 roo 命令.

    roo> osgi ps
    START LEVEL 99
    ID State Level Name
    [ 0] [Active ] [ 0] System Bundle (3.0.7)
    [ 1] [Active ] [ 1] jansi (1.5)
    …
    [ 68] [Resolved ] [ 1] com-oracle-roo-jdbc (11.2.0.2_0001)
    

    这显示了 com-oracle-roo-jdbc 包的 id:68

    roo> osgi headers
    
    …
    com-oracle-roo-jdbc (68)
    ————————
    Bnd-LastModified = 1309962402810
    Build-Jdk = 1.6.0_07
    Built-By = jplandrain
    Bundle-Description = This bundle wraps the standard Maven artifact: ojdbc5-11.2.0.2.
    Bundle-License = http://www.oracle.com
    Bundle-ManifestVersion = 2
    Bundle-Name = com-oracle-roo-jdbc
    Bundle-SymbolicName = com.oracle.roo.jdbc.ojdbc5
    Bundle-Vendor = Oracle (wrapped into an OSGi bundle by the Spring Roo project build system)
    Bundle-Version = 11.2.0.2_0001
    Created-By = Apache Maven Bundle Plugin
    Export-Package = …
    

    检查包 com-oracle-roo-jdbc (68) 的详细信息,特别是“Bundle-SymbolicName”值

    roo> osgi uninstall com.oracle.roo.jdbc.ojdbc5
    

    就是这样。已删除。

    【讨论】:

    • 感谢您的帖子 - 原件有助于让我走上正轨 - 但对于从未处理过 osgi 的人来说,当我开始不得不打开生成的 JAR 并干预 MANIFEST 时,它变得毛茸茸的。 MF 在包含的 WEB-INF 目录中。可能值得修改原始帖子,例如打开清单,从导入部分中删除以下“...”,然后运行 ​​roo>osgi install --url file:///c:\path\to\ current\dir\oracle\file_generated_by_wrapper.jar 好的,这是手持的 - 但 Roo 的目的是让它变得简单......
    • 已接受。感谢您的澄清 - 尤其是您的原始帖子 nidget.wordpress.com/2011/07/21/…
    【解决方案3】:

    截至 2016 年(Spring Roo 1.3.2),对于曾经搜索如何卸载 OSGi 的人来说,以下是对我有用的方法。

    roo> osgi卸载--bundleSymbolicName "com.oracle.roo.jdbc.ojdbc6"

    捆绑“com.oracle.roo.jdbc.ojdbc6”:已卸载!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 2020-03-22
      相关资源
      最近更新 更多