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 包从类路径错误中获取资源的主要内容,如果未能解决你的问题,请参考以下文章
OSGi 捆绑包从非捆绑包 jar 导入包:为它们创建捆绑包?