OSGi 包从类路径错误中获取资源

Posted

技术标签:

【中文标题】OSGi 包从类路径错误中获取资源【英文标题】:OSGi bundle gettin resourses from classpath errors 【发布时间】:2012-09-13 16:50:40 【问题描述】:

我正在编写休眠 dto-mapping osgi 包(用于 glassfish),而这个包没有看到来自类路径的资源。

清单文件:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Model
Bundle-SymbolicName: com.test.spm.model
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.test.spm.model.Activator
Bundle-Vendor: TEST
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"
Require-Bundle: org.hibernate.core;bundle-version="4.1.7"
Export-Package: com.test.spm.model,
 com.test.spm.model.dto,
 com.test.spm.model.dto.base,
 com.test.spm.model.util
Bundle-ClassPath: .,
 lib/sqljdbc4.jar

无法从 sqljdbc4.jar 访问文件,错误:

Caused by: java.lang.ClassNotFoundException: Could not load requested class : com.microsoft.sqlserver.jdbc.SQLServerDriver

但是这个库存在于导出的 jar 文件中。

我也无法通过类路径访问休眠配置文件和映射文件(找不到类和资源也找不到异常)。但下一个代码有效:

            sessionFactory = new Configuration().configure(HibernateUtil.class.getClassLoader().getResource("hibernate.cfg.xml"))
                    .addURL(HibernateUtil.class.getClassLoader().getResource("mapping/Project.hmb.xml"))
                    .buildSessionFactory();

我尝试调用

System.out.println(HibernateUtil.class.getClassLoader().getResource("hibernate.cfg.xml")); 

并在 sys out 中看到这个:

bundle://376.0:1/hibernate.cfg.xml

搜索了捆绑类路径选项,但我的清单似乎没问题。 我需要一些特定的包类路径属性来让我的包看到类路径资源,还是什么?感谢您的帮助!

【问题讨论】:

【参考方案1】:

Hibernate 无法在包含 jar 库的包之外的其他包中找到任何资源。Hibernate 不知道 OSGI 清单文件并忽略它们,因此您的清单文件是否正确并不重要与否。

请参阅my answer in this thread,我在那里提供的解决方案也应该适用于您的问题。

【讨论】:

你是完全正确的,我在这个包中添加了休眠库并且一切正常!但是你能解释一下接下来的事情吗:我的最后一个项目是 RCP 项目(OSGi(Equinox)捆绑插件系统也是),我将休眠库插件与 dto-mapping 插件分开并且一切正常! RCP 捆绑系统和我的问题有什么不同? 我无法解释,因为我不了解 RCP 编程,也不知道您的项目是如何安装的。主要问题是,hibernate.cfg.xml中指定的资源中的路径是相对于执行的bundle的主目录(即hibernate库所在的bundle),并且没有标准的方法休眠以指定到另一个包的路径。

以上是关于OSGi 包从类路径错误中获取资源的主要内容,如果未能解决你的问题,请参考以下文章

从类路径目录中获取资源列表

从类路径资源(XML 文件)获取输入流

OSGi 捆绑包从非捆绑包 jar 导入包:为它们创建捆绑包?

从类路径加载资源

如何使用 informix.jvp.dbapplet.impl.JVPClassLoader 从类路径加载资源?

从类路径资源解析 XML 文档时出现意外异常