【发布时间】:2017-05-31 11:29:09
【问题描述】:
我知道这是一个常见问题,但是创建一个新线程以防万一有人像我一样在尝试了文档中已经解释的一些选项后仍然卡住了。
我已经部署了一个 osgi 包(比如包 B),其中包含与数据层访问相关的所有代码。基本上,当访问此捆绑包中的服务方法时,它仅在第一次通过加载驱动程序时创建 JDBC 连接。驱动程序被部署为另一个包装好的 sqljdbc 4.0 包。 (说 C 包)
现在我有 Bundle TestApp(比如 Bundle A),它从 Bundle B 中创建上述服务方法的实例。所以这里的流程是 Bundle A 代码创建 Bundle B 的导出服务的实例,然后访问 Bundle C 的 Driver 类.
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver not found by DataServices [417]
at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1556)
at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:77)
at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1993)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
单个类加载器在这里提出问题,但如何克服是我这里的情况。我尝试将 DynamicImport-Package 添加到捆绑包 A、B,尝试创建一个片段捆绑包,如此处 https://gist.github.com/rotty3000/1291842 所述,但仍然是相同的例外。继续。
如果有人遇到这样的问题,如果你能给我一个逐步解决这个问题的方法,那将是一个很大的帮助。
提前谢谢大家,祝大家新年快乐。
【问题讨论】:
-
你的包中有什么代码(只显示相关行)。在异常发生时它会做什么?
-
来自 Bundle A,PremiumService 服务 = new PremiumServiceImpl();来自 Bundle B PremiumServiceImpl,dao.getJdbcConnection(),依次调用 Class.forName(),来自 Bundle C,sqljdbc4-4.jar,它是一个包装好的 bundle
-
当我在 Class.forName(driverClassName) 这一行调试应用程序时,类加载器是捆绑类加载器,捆绑包作为捆绑包 A 的名称,而这行代码位于捆绑包 B (DataServices)项目。驱动程序类名称值也被确认为正确。
标签: osgi osgi-bundle jbossfuse karaf blueprint-osgi