jav*_*y79 3 java osgi classloader
我有一个嵌入在一个包中的jar,需要获取与它一起打包的资源,如下所示:
MyBundle
-\ src
-\lib
-\MyEmbeddedJar
-\src
-\SomeClass
-\someResource.xml
Run Code Online (Sandbox Code Playgroud)
我试图从'SomeClass'访问'someResource.xml',如下所示:
SomeClass.class.getResource( "someResource.xml" );
Run Code Online (Sandbox Code Playgroud)
但我没有运气.我已经尝试了附加CWD的几个变体(例如:'./ someResource.xml'),但我无法加载此资源.
我知道"正确"的方法是使用Activator来获取正确的类加载器,但嵌入式jar可以在其他项目中使用,所以我不想为了获得它而必须添加OSGi特定代码与OSGi玩得很好.
有没有其他方法可以在OSGi的OSGi中加载资源?
我假设它SomeClass
位于嵌入式jar中(比如说somejar.jar
),并且someResource.xml
位于外部jar中的lib
目录中.
在这种情况下,无法在非OSGi上下文中实现这一点.让我们孤立地看一下这两种情况.
someResource.xml
使用常规(非特定于OSGi)的资源加载机制可以很好地访问您,只要它可以从Bundle-ClassPath
.例如,如果您有以下清单标题,
Bundle-ClassPath: ., somejar.jar
Run Code Online (Sandbox Code Playgroud)
您将能够使用您的资源"lib/someResource.xml"
.注意类路径上的点:这意味着您可以从jar的根目录获取类和资源.如果你忘记了,你将只能进入里面的课程和资源somejar.jar
.
如果您没有使用OSGi,那么就没有(相当简单的)方法来获取我所知道的内部jar中的类和资源.
根据您希望捆绑包的外观,您现在有两种选择.
SomeClass
在嵌入式罐子里?如果是这样,你就会感到茫然,而你的jar只会使用OSGi.somejar.jar
到您的jar中,则可以解决问题,并且您的jar可以在两种情况下都能正常工作.就个人而言,我会选择选项2:除非你有资源在你'合并'罐子时可能会互相覆盖,所以在你的包里面有一点点资源是没有问题的.