如何在另一个jar中获取资源

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中加载资源?

Ang*_*jpt 5

我假设它SomeClass位于嵌入式jar中(比如说somejar.jar),并且someResource.xml位于外部jar中的lib目录中.

在这种情况下,无法在非OSGi上下文中实现这一点.让我们孤立地看一下这两种情况.

在OSGi中

someResource.xml使用常规(非特定于OSGi)的资源加载机制可以很好地访问您,只要它可以从Bundle-ClassPath.例如,如果您有以下清单标题,

Bundle-ClassPath: ., somejar.jar
Run Code Online (Sandbox Code Playgroud)

您将能够使用您的资源"lib/someResource.xml".注意类路径上的点:这意味着您可以从jar的根目录获取类和资源.如果你忘记了,你将只能进入里面的课程和资源somejar.jar.

不使用OSGi

如果您没有使用OSGi,那么就没有(相当简单的)方法来获取我所知道的内部jar中的类和资源.

你的选择

根据您希望捆绑包的外观,您现在有两种选择.

  1. 是否真的有必要SomeClass在嵌入式罐子里?如果是这样,你就会感到茫然,而你的jar只会使用OSGi.
  2. 如果您可以选择"解压缩" somejar.jar到您的jar中,则可以解决问题,并且您的jar可以在两种情况下都能正常工作.

就个人而言,我会选择选项2:除非你有资源在你'合并'罐子时可能会互相覆盖,所以在你的包里面有一点点资源是没有问题的.