我有一个嵌入在捆绑包中的 jar,需要获取与其打包的资源,如下所示:
MyBundle
-\ src
-\lib
-\MyEmbeddedJar
-\src
-\SomeClass
-\someResource.xml
我正在尝试从“SomeClass”访问“someResource.xml”,如下所示:
SomeClass.class.getResource( "someResource.xml" );
但我没有运气。我已经尝试了附加 CWD 的几种变体(例如:“./someResource.xml”),但我就是无法加载此资源。
我知道“正确”的方法是使用 Activator 将钩子返回到正确的类加载器,但是嵌入式 jar 可以在其他项目中使用,所以我讨厌必须向其中添加 OSGi 特定代码才能获得它与 OSGi 良好配合。
还有其他方法可以在 OSGi 中加载资源吗?
我假设SomeClass
位于嵌入的 jar 内(例如,somejar.jar
), and someResource.xml
是在外罐子里,在lib
目录。
在这种情况下,无法在非 OSGi 上下文中实现这一点。让我们单独看看这两种情况。
In OSGi
Your someResource.xml
应该可以使用常规(非 OSGi 特定)资源加载机制来访问,provided它可以从Bundle-ClassPath
。例如,如果您有以下清单标头,
Bundle-ClassPath: ., somejar.jar
您将能够使用以下方式获取您的资源"lib/someResource.xml"
。
注意类路径上的点:这意味着您可以从 jar 的根访问类和资源。如果你忘记了这一点,你将只能访问里面的课程和资源somejar.jar
.
不使用 OSGi
如果您不使用 OSGi,据我所知,没有(相当简单的)方法可以获取内部 jar 内的类和资源。
您的选择
根据您希望捆绑包的外观,您现在有两种选择。
- 真的有必要吗
SomeClass
是在嵌入式罐子里吗?如果是这样,你就不知所措了,你的 jar 只能使用 OSGi 工作。
- 如果您可以选择“解压”
somejar.jar
到你的罐子里,你就颠覆了问题,并且你的罐子可以在两种情况下工作。
就我个人而言,我会选择选项 2:除非您的资源在“合并”罐子时可能会相互覆盖,否则在您的包中包含一些稍微混乱的资源是没有问题的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)