我希望我的捆绑包可以通过系统属性或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
,这使得这个程序包依赖项真正可选吗?
答案 0 :(得分:1)
判断程序包是否在运行时可用的方法是尝试从中加载一个类并为NoClassDefFoundError做好准备。您可以在中心位置执行此操作,然后决定避免需要可选但不存在的程序包的代码路径。
答案 1 :(得分:0)
PackageAdmin可用于检查系统的包元数据。它已被弃用,您应该使用BundleWiring。 因此,在您的DS中,您将依赖于PackageAdmin / BundleWiring并检查cm包是否已导出...