gpt4 book ai didi

java - 执行 java.io.File 或 FileInputStream 时如何引用 OSGi 包中包含的文件

转载 作者:搜寻专家 更新时间:2023-10-30 21:26:09 25 4
gpt4 key购买 nike

我正在使用 aQute Bnd 工具集来创建 OSGi 包,并打包了一些相关的“资源”文件。这包括我创建的资源目录中的 *.css 文件和 *.xsd 文件。

我在 bundle.bnd 文件中包含了以下内容:

Include-Resource: resources/=resources/ 

当我进行构建时,生成的 *.jar 文件在 jar 包文件顶层目录的资源目录中包含 *.css 和 *.xsd 文件。

但是,在实际代码中,我很难尝试将其作为我的类路径的一部分:

我尝试了以下方法:

new File("resources/example.css");

我也试过:

URL cssFile = this.getClass().getResource("resources/example.css");
try
{
file = new File(cssFile.toURI()));
}
catch(Exception e)
{
e.printStackTrace();
}

我要么收到 NullPointException 错误,要么收到 File cannot be found IOException 错误(取决于我使用的是哪一个)。在调试配置模式下的 Eclipse Equinox 和 Apache Felix(我们用于部署的)中运行时出现此错误。请注意,我试图在 BundleActivator 之外的 Java 类中执行此操作。

我是否需要始终引用 BundleActivator 的上下文?

 /*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception
{
/* Service to host the Bundle interface. */
ServletContainerService service = new ServletContainerService();
service.addServlet(new ServletContainer(new AxisServlet(), true));
this.serverReg = context.registerService(ServletContainerService.class.getName(), service, null);

cssFile = new File(context.getClass.getResource("resource/example.css"));
}

我认为上面的方法可行,但这意味着我将不得不传递 cssFile 引用,它看起来并不优雅。

有什么方法可以在作为 bundle/.jar 文件一部分的任何给定 Java 类中引用 bundle jar 文件中包含的“资源”目录的路径?如果它涉及到 BundleContext,有没有办法在任何 Java 类中引用它?

任何帮助将不胜感激。


我看过并且Including additional resources with OSGi bundles但看来您需要 BundleContext。

我可能已经找到了可能的解决方案:http://www.vogella.de/blog/tag/plugin/

看起来 Vogella 对此有一些示例代码:

URL url;
try {
url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");
InputStream inputStream = url.openConnection().getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
String inputLine;

while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}

in.close();

} catch (IOException e) {
e.printStackTrace();
}

有谁知道这条路径是否相同,如果它不是一个插件,如果我使用不同的 OSGi 环境,例如。 Equinox Eclipse 对比 Apache Felix?例如url = new URL("platform:/plugin/de.vogella.rcp.plugin.filereader/files/test.txt");

最佳答案

Bundle interface有一个getEntry(java.lang.String path)方法返回一个 Url 并记录为:

返回指向此包中指定路径的条目的 URL。该包的类加载器不用于搜索条目。仅搜索此 bundle 的内容以查找条目。指定的路径总是相对于这个包的根并且可以以“/”开头。 “/”的路径值表示此包的根。

关于java - 执行 java.io.File 或 FileInputStream 时如何引用 OSGi 包中包含的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com