[英]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)的资源加载机制可以很好地访问someResource.xml
, 前提是可以从Bundle-ClassPath
访问它。 例如,如果您有以下清单标题,
Bundle-ClassPath: ., somejar.jar
您将能够使用"lib/someResource.xml"
访问您的资源。 注意类路径上的点:这意味着您可以从jar的根目录获取类和资源。 如果您忘记了这一点,您将只能somejar.jar
类和资源。
如果您没有使用OSGi,那么就没有(相当简单的)方法来获取我所知道的内部jar中的类和资源。
根据您希望捆绑包的外观,您现在有两种选择。
SomeClass
是否真的有必要在嵌入式jar中? 如果是这样,你就会感到茫然,而你的jar只会使用OSGi。 somejar.jar
'解包'到您的jar中,则可以解决问题,并且您的jar可以在两种情况下都能正常工作。 就个人而言,我会选择选项2:除非你有资源在你'合并'罐子时可能会互相覆盖,所以在你的包里面有一点点资源是没有问题的。
我的假设是:
如果有问题的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.