当前位置: 首页 > 面试题库 >

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

凌善
2023-03-14
问题内容

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

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

Include-Resource: resources/=resources/

当我进行构建时,生成的 .jar文件在jar捆绑包文件顶部目录的resources目录中具有 .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错误或找不到文件IOException错误(取决于我使用的是哪一个)。在Eclipse Equinox的Debug
Configuration模式和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参考。

有没有办法引用捆绑/.jar文件中任何给定的Java类中捆绑jar文件中包含的“
resources”目录的路径?如果涉及BundleContext,是否有任何方法可以在任何Java类中引用它?

任何帮助都感激不尽。

我看过OSGi捆绑包并包括了其他资源,但看来您需要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");


问题答案:

该捆绑接口具有getEntry(java.lang.String path)其返回一个地址和记录为方法:

返回此包中指定路径处条目的URL。 该捆绑软件的类加载器不用于搜索条目。仅搜索该捆绑软件的内容作为条目。指定的路径始终是相对于此包根目录的,并且可以以“
/”开头。路径值“ /”表示此捆绑包的根。



 类似资料:
  • 我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner

  • 我正在将我的spring-java项目转移到OSGi。 我有一些依赖项,这些依赖项在spring ebr repo或maven repo中不能作为包提供。处理它们的最佳方法是什么? null

  • 我有以下示例方案...(请注意,我可以使用服务实现该场景,但我正在尝试一些事情) 一个带有激活器类(将其命名为“客户端”)的OSGi捆绑包,另一个OSGi打包包是一个简单的库(将其称为“服务器”),公开了一个名为callMe()的方法。在“client”的start()方法中,有一个对“server”的callMe()方法的调用。当然,“服务器”包公开了我们使用callMe()方法的类的包,“客户

  • 简单的OSGi应用程序与包内的依赖关系。 我在玩karaf。我从写一个简单的Rest应用程序开始。https://github.com/YaroslavTir/osgi-jersey-hibertate/tree/stackoverflow/examples/karaf-rest-core 我将karaf示例作为backbond,使用restendpoint运行我的第一个包非常简单,但是当我添加m

  • 我试图在Felix中添加一个新的OSGI包(没有Karaf)作为ActiveMQ客户端(消息发送方)。 ActiveMQ客户端在非OSGI环境中运行良好。但当我在Felix中使用相同的代码(稍加修改)时,它会抛出以下错误: org.osgi.framework.捆绑异常:无法解决com.packtpub.felix.bookshelf-库存-impl-mock[7](R 7.3):缺少需求[com

  • 我使用EclipseIndigo使用OSGiJava框架开发了一些包。有一个主捆绑包,它依赖于其他捆绑包,并且具有要运行的主程序。如果我尝试在Eclipse中运行所有捆绑包,一切都正常工作,但是如果我将每个捆绑包保存为一个JAR,并在命令行中启动OSGi框架,当我尝试启动主捆绑包时,会出现异常<code>NoClassDefFoundError。找不到的类是依赖项。包的其余部分处于活动状态,主包刚