繁体   English   中英

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

[英]How to get a resource in another jar

我有一个嵌入在一个包中的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的OSGi中加载资源?

我假设SomeClass位于嵌入式jar中(例如somejar.jar ), someResource.xml位于外部jar中,位于lib目录中。

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

在OSGi中

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

Bundle-ClassPath: ., somejar.jar

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

不使用OSGi

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

你的选择

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

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

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

我的假设是:

  1. 我不太确定我对问题的描述与图表的匹配程度如何。 * .jar文件在哪里?
  2. 尝试访问嵌入式jar的bundle是包含嵌入式jar的bundle。
  3. 根据OSGi不可知论,我假设嵌入式jar未作为当前bundle的类路径的一部分显式公开,并且它不作为另一个OSGi bundle加载。

如果有问题的jar本身是当前类加载器的资源,那么首先需要将jar作为资源或InputStream,例如使用MyBundleClass.class.getResourceAsStream("/pathToJar.jar"); 然后用java.util.jar.JarInputStream包装它。 然后,继续调用getNextJarEntry()直到找到JarEntry对象,其中"someResource.xml".equals(jarEntry.getName())

我将接受@ Angelo的解决方案,因为它给了我如何解决这个问题的想法,但是,我想添加更多信息 - 因此我的回答。

我的工作是为SomeClass添加另一个构造函数,它接受一个java.net.URL实例。 我还将someResource.xml复制到bundle的根目录中。

然后,我更新了包中SomeClass的实例化,如下所示:

new SomeClass( FileLocator.find( Activator.getDefault().getBundle(), new Path( "./someResource.xml" ), new HashMap< String, String >() ) );

这对我来说似乎是一个非常大的黑客。 如果我无法编辑SomeClass的内容怎么办? 我想我必须解压缩它或者我被迫把它包装成它自己的捆绑包?

我将做出以下假设:

embedded.jar
SRC / SomeClass.class
someResource.xml

bundle包含embedded.jar,embedded.jar在Bundle-Classpath上。

在这种情况下, SomeClass.class.getResource("someResource.xml")将在名为src/someResource.xml的类路径中查找资源,因为SomeClass位于包src中。 为了在jar的根目录中获取someResource.xml,您需要改为使用SomeClass.class.getResource("/someResource.xml")

这不是OSGi特有的,这只是资源加载在Java中的工作原理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM