OSGi如何安装两个完全相同的捆绑?

时间:2013-05-23 18:37:37

标签: java osgi bundle fuseesb

我想在OSGi容器中两次安装两个相同的bundle或同一个bundle。我使用的OSGi容器是FUSE ESB。这是捆绑信息:

的pom.xml:

<groupId>com.helloworldbundle</groupId>
<artifactId>HelloWorldBundle</artifactId>
<version>1.0.0-SNAPSHOT</version>

蓝图:

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

  <bean id="helloworldbundlecopybean"
    class="com.helloworldbundle.HelloWorld"
    init-method="init" destroy-method="destroy">
  </bean>

</blueprint>

首次安装成功。当我再次尝试安装时,它失败了。然后我制作一个项目副本并进行修改:

将项目文件夹名称更改为HelloWorldBundleCopy

将工件更改为

<artifactId>HelloWorldBundleCopy</artifactId>

将bean id更改为

<bean id="helloworldbundlecopybeancopy"

但我仍然无法安装修改后的捆绑包:

Error executing command: Error installing bundles:
Unable to install bundle /home/li/Documents/Java/HelloWorldBundleCopy/target/HelloWorldBundleCpoy-1.0.0-SNAPSHOT.jar

更新我的问题:

以下是我的情景:

我有三台主机:Host1,Host2和Host3

FUSE ESB OSGi容器安装在Host3中。 我需要在Host1和Host2上运行一个服务,例如HelloWorld。此服务已在Host3上的FUSE ESB中注册。

这就是为什么我需要使用FUSE ESB两次注册相同的包。

这是我的问题:

  1. 是否可以在容器外部运行捆绑包,例如在一台主机上运行HelloWorld捆绑包,但是将其注册到另一台主机上的FUSE ESB?怎么做?我之前做过的实验是通过以下方式在同一台机器上向FUSE ESB注册服务包:

    FuseESB:karaf @根&GT;安装文件:/ home / li / Document / Java / Hello WorldBundle / target / HelloWorldBundle-1.0.0-SNAPSHOT.jar

  2. 2.如何修改现有的maven项目以便在不创建新的maven项目的情况下再次安装它?

1 个答案:

答案 0 :(得分:5)

在OSGi中,Bundle-SymbolicNameBundle-Version的组合就像捆绑包的“主键”...您无法安装两个具有完全相同的符号名称和版本的捆绑包。

在你的问题中,你已经将工具与运行时问题混为一谈,因此很难说出真正发生了什么......无论如何,你已经改变了Maven中的artifactId,但我不知道它可能会对Bundle-SymbolicName,这是OSGi关心的。如果更改该标头,则可以安装此捆绑包两次。

然而,这引出了一个问题,为什么要两次安装相同的捆绑包?这很少有用。请解释你为什么要这样做;它可能会为您的潜在问题提供更好的解决方案。