使用同一文件安装两个软件包

时间:2014-01-27 11:13:25

标签: osgi bundle apache-felix declarative

我正在使用OSGI声明性服务。

在我的java应用程序中,我启动Apache Felix,并安装并启动一些软件包。

使用相同的文件路径安装了两个软件包。捆绑包启动后,它应显示“Hello”消息。

当我安装并启动第一个包时:

Bundle bundle1 = context.installBundle("file:C://Users//bundles//myBundle.jar");
bundle1.start();

这在控制台中显示“Hello”。

但是,当我安装第二个包(与第一个包具有相同的文件路径)时

Bundle bundle2= context.installBundle("file:C://Users//bundles//myBundle.jar");
bundle2.start();

我没有看到任何输出。这意味着忽略了第二个软件包的安装和/或启动。

我需要一种方法来安装和启动具有相同文件路径的两个不同的bundle,当我停止其中一个bundle时,另一个应保持ACTIVE。我怎么可能实现这一目标?谢谢。

我正在考虑的用例:假设我有两个用户,并且都希望使用相同的功能(捆绑)。如果其中一个人决定停止捆绑功能,另一个人想保留它呢?

有没有更好的方法来实现这一目标?感谢。

3 个答案:

答案 0 :(得分:1)

您可以调用该功能

context.installBundle(location,inputStream)

并将InputStream传递给该函数。在这种情况下,您可以指定两个不同的位置(例如,具有某些含义但不是真实位置的位置)。

如果两个具有相同SymbolicName和相同版本的捆绑包不能存在两次,那么您的下一个问题就是。

我无法想象应该安装两次相同捆绑包的用例。这可能是一个糟糕概念的结果。

答案 1 :(得分:1)

文件内容在安装两次之间是否会发生变化?如果没有,那么你不能这样做。基本上你正在尝试将bundle实例化两次,而OSGi只允许每个bundle安装一次。

实际上,您可以同时拥有多个版本的捆绑包,但Bundle-SymbolicNameBundle-Version对在框架内必须是唯一的。

将用户功能映射到已安装的捆绑包确实不是一个好主意。用户为什么要关心应用程序中安装的模块?相反,您希望使捆绑中的功能支持多个用户。

答案 2 :(得分:1)

您需要考虑两件事:捆绑位置必须是唯一的,并且框架必须设置为接受具有相同捆绑符号名称的多个捆绑包。你应该使用bundleContext.install(location, inputStream) 安装捆绑包。也许是这样的:

byte[] byteArray byteArray = IOUtils.toByteArray(new FileInputStream(new File(filePath);
Bundle bundle = bc.installBundle(jobID, new ByteArrayInputStream(byteArray));

要使框架能够接受具有相同捆绑包符号名称的多个捆绑包,您需要使用以下选项启动框架:

-Dorg.osgi.framework.bsnversion=multiple

请注意,update命令仍会尝试从给定位置更新捆绑包,在我的情况下(jobID)不是真正的文件路径。这与我的用例无关,所以我从不打扰解决它。