是否有推荐的方法在运行时修补OSGi应用程序?我正在使用OSGi的equinox实现。
如果我停止特定捆绑并安装修补捆绑包。它将如何在运行时影响其他bundle?..
我看到了这个OSGi Application Patching Strategy,并没有给出明确的答案。
感谢。
答案 0 :(得分:1)
我认为这取决于捆绑包的质量。
“OSGi in Action”一书中有一个很好的例子,第73页。
自己尝试一下:
osgi-in-action/chapter03/build.xml
),chapter03/paint-example/bundles/*-3.0.jar
个文件复制到例如chapter03/shell-example/1
,为了使示例有效(请参阅issue),您需要执行此操作:
org.apache.felix.main.distribution-4.2.1.zip
文件felix-framework-4.2.1/bin/felix.jar
文件default.properties
文件复制到OSGi示例的chapter03/shell-example/launcher.jar
。现在你准备好了一切:
// 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?中进行了充分的讨论。