使用 OSGI 作为插件管理器并且不让主程序成为 OSGI 包

问题描述 投票:0回答:1

我一直在考虑替换现有的插件系统,该系统运行良好,具有合理的安全性,并且与 OSGI 一起使用非常简单。 主程序不会是 OSGI 包(不要问为什么,这超出了这个问题的范围) OSGI 做了一些漂亮的事情,比如自动安装给定目录中的所有 jar 等 - 这非常整洁,以及其他一些漂亮的事情,这些事情又超出了这个问题的范围。 我的问题是这样的: osgi 框架(在本例中为 Felix)是否可以存在于一个更大的程序中,该程序将提供一些接口定义,插件需要根据它们的功能来实现这些接口定义,然后才能加载它们?

我已经有一些代码可以工作了 - 但你可以猜到我正处于类加载器地狱中。 在运行时,激活器无法解析主应用程序提供的接口。 看起来 OSGI 可以*很好地管理捆绑包之间公开的类,但它不能很好地处理超出其控制范围的事情。
在这种情况下,OSGI 是否根本不值得?尤其是当我现在所拥有的大部分工作得很好时。

我尝试编写一个相当小的程序来启动 Felix(成功) 它有自己的激活器,可以成功地将自己作为服务放入根包中。 当我尝试从主程序访问该服务时 - 它起作用了。

当我尝试创建一个完全独立的插件(即不同的 Eclipse 项目)时,它安装并解决了 - 就像我所期望的那样,但它在启动时给出了可怕的 java.lang.NoClassDefFound 错误。

我怀疑那是因为主程序正在使用旧的、方便的系统类加载器和朋友,而由 OSGI/Felix 加载的另一个插件正在由它自己的 ClassLoader 加载,在本例中是一个“旧的”组织.apache.felix.framework.BundleWiringImpl$BundleClassLoader。因为他们幸福地不知道彼此,所以决议变得“令人兴奋”。

清单导出包中似乎只指定导出什么*,而不是指定查看位置。

任何关于如何实现这一点的想法(无需将主程序捆绑在一起)都会很棒。如果没有,也许有些人可以从我的经验中学到一些......

osgi-bundle
1个回答
0
投票

配置中的 org.osgi.framework.system.packages.extra 属性似乎可以让您将包从系统类加载器公开到系统捆绑包中,然后公开给所有插件。

ffi:https://felix.apache.org/documentation/subprojects/apache-felix-framework/apache-felix-framework-configuration-properties.htmlhttps://moi.vonos.net/java/osgi-classloaders/

© www.soinside.com 2019 - 2024. All rights reserved.