目前我正在使用Jetty和Equinox开发基于OSGi的WebApp(参见:http://wiki.eclipse.org/Jetty/Tutorial/EclipseRT-Jetty-Starter-Kit)。 到目前为止一切都很好,但我无法访问我自己的一些文件/资源。 位置/路径是“configuration / data / config.csv”和“configuration / data / data.zip”。 我测试了一切:
context.getBundleContext().getBundle().getEntry("config.csv");
context.getBundleContext().getBundle().getResource("config.csv");
this.getClass().getClassLoader().getResource("config.csv");
context.getBundleContext().getDataFile("config.csv");
当然所有可能的路径变体如:“configuration / data / config.csv”,“/ configuration / data / config.csv”,“\ configuration / data / config.csv”,“/ config.csv” 。 此外,我已将文件夹添加到OSGi类路径(在MANIFEST.MF中):
Bundle-ClassPath: .,
configuration/data/
生成的URL看起来总是像这样(或null):“configuration / CBR-Data / config.csv”,当我将它传输到File对象“D:\ configuration \ CBR-Data \ config.csv”时
但我真正不明白的是我的一个DS的属性文件被完美加载:
<properties entry="configuration/dsconfig.properties"/>
有人有想法/提示或其他什么?我开车疯了......
答案 0 :(得分:13)
您正在从捆绑包中正确检索资源。我建议你熟悉getEntry(),getResource()和getDataFile()之间的区别。
因为方法会返回正确的URL,这意味着资源位置正确,问题在于您如何阅读它们。
使用它们的两种方法是:
InputStream
打开URL
:
URL configURL = context.getBundleContext().getBundle().getEntry("configuration/data/config.csv");
if (configURL != null) {
InputStream input = configUrl.openStream();
try {
// process your input here or in separate method
} finally {
input.close();
}
}
URL
转换为File
。建议不要使用此方法,因为它假设Bundle部署为目录(而不是归档)。但是,如果必须处理需要使用File
个对象的旧库,则会很有帮助。要转换为File,您不能使用URL.getPath()
方法,因为Equinox有自己的URL格式。您应该使用org.eclipse.core.runtime.FileLocator
课程来解析为File
。 FileLocator.getBundleFile(Bundle)
完全符合您的要求。答案 1 :(得分:4)
解决!!! 感谢Danail Nachev(见评论)带我走向正确的道路!在“bundleentry:// xyz”和“bundleresource://”之后进行了一些搜索后,我发现了这个邮件列表帖子:http://www.mail-archive.com/felix-dev@incubator.apache.org/msg02410.html
所以答案如下(Usging(Equinox)FileLocator):
URL configURL = context.getBundleContext().getBundle().getResource("config.csv");
File configFile = new File(FileLocator.toFileURL(configURL).getPath());
但是(也在那个邮件列表中询问)如果存在其他不仅适用于Equinox的解决方案,那将会很有趣吗?