如何使用可选的包解析创建一个有效的OSGi包?

时间:2016-05-24 18:48:36

标签: java osgi

我希望我的捆绑包可以通过系统属性或OSGi Compendium配置管理员进行配置。

我正在针对org.osgi:osgi.cmpn:6.0.0包编译我的包,其中made clear in the OSGi Alliance blog仅用于编译时,框架在运行时提供实际的实现。

我的代码显然需要使用ConfigAdmin包(用于处理存在ConfigAdmin服务的情况)...这意味着如果运行时没有导出ConfigAdmin包,我的包将无法正确解析。

但我希望这个解决方案是可选的......所以我将其添加到清单中:

org.osgi.service.cm;resolution:=optional;version="[1.5,2)"

现在,捆绑包将解析,但在运行时将使用java.lang.NoClassDefFoundError: org/osgi/service/cm/ManagedService崩溃,即使用户实际上不会使用ConfigAdmin进行配置。因此,这会强制用户安装config-admin软件包,以使我的软件包正常工作。

我想这里的秘密是不要实例化强制JVM加载使用org.osgi.service.cm包的类的任何类...但是我看不出如何在没有反射的丑陋黑客的情况下实现这一点...

有没有人知道如何检查程序包是否在运行时可用,如果没有,请在运行时避免使用java.lang.NoClassDefFoundError,这使得这个程序包依赖项真正可选吗?

2 个答案:

答案 0 :(得分:1)

判断程序包是否在运行时可用的方法是尝试从中加载一个类并为NoClassDefFoundError做好准备。您可以在中心位置执行此操作,然后决定避免需要可选但不存在的程序包的代码路径。

答案 1 :(得分:0)

PackageAdmin可用于检查系统的包元数据。它已被弃用,您应该使用BundleWiring。 因此,在您的DS中,您将依赖于PackageAdmin / BundleWiring并检查cm包是否已导出...