OSGi应用程序修补机制

时间:2014-03-10 08:08:16

标签: java osgi osgi-bundle

是否有推荐的方法在运行时修补OSGi应用程序?我正在使用OSGi的equinox实现。

如果我停止特定捆绑并安装修补捆绑包。它将如何在运行时影响其他bundle?..

我看到了这个OSGi Application Patching Strategy,并没有给出明确的答案。

感谢。

2 个答案:

答案 0 :(得分:1)

我认为这取决于捆绑包的质量。

“OSGi in Action”一书中有一个很好的例子,第73页。

自己尝试一下:

  1. 下载examples
  2. 解压缩文件并使用Ant(osgi-in-action/chapter03/build.xml),
  3. 构建“chapter03”示例
  4. chapter03/paint-example/bundles/*-3.0.jar个文件复制到例如chapter03/shell-example/1
  5. 为了使示例有效(请参阅issue),您需要执行此操作:

    1. this page下载最新的Apache Felix Framework发布版,目前为4.2.1,
    2. 解压缩org.apache.felix.main.distribution-4.2.1.zip文件
    3. 解压缩felix-framework-4.2.1/bin/felix.jar文件
    4. default.properties文件复制到OSGi示例的chapter03/shell-example/launcher.jar
    5. 现在你准备好了一切:

      // In console window #1:
      $ cd chapter03/shell-example/
      $ java -jar launcher.jar bundles
      
      // In console window #2:
      $ telnet localhost 7070
      -> install file:1/paint-3.0.jar
      -> install file:1/shape-3.0.jar
      -> start 2
      -> install file:1/circle-3.0.jar
      -> install file:1/square-3.0.jar
      -> start 4
      -> start 5
      -> install file:1/triangle-3.0.jar
      -> start 6
      // You can now draw all three shapes.
      
      // Simulate upgrade/patch of "circle" bundle:
      -> stop 4
      // A "work in progress" sign is in place of the circles.
      // You can still move them.
      
      // Start the "circle" bundle again and they're back in the UI:
      -> start 4
      

      您可以查看示例源代码,了解他们是如何做到的。 我希望这能回答你的问题。

答案 1 :(得分:0)

部分取决于捆绑包是使用服务还是导入/导出包。服务更具活力。

如果修补的类作为导出的包使用,则其使用者将具有对原始类的引用。要强制移动到新的,必须在控制台中或直接在“FrameworkWiring”实例上调用refresh packages。 (它现在被称为'refreshBundles',但原理类似。)

在密切相关的问题How does OSGi bundle update work?中进行了充分的讨论。