我希望我的包可以通过系统属性或通过 OSGi Compendium 配置管理进行配置。
我正在针对 org.osgi:osgi.cmpn:6.0.0
包编译我的包,其为 made clear in the OSGi Alliance blog仅在编译时使用,框架在运行时提供实际的实现。
我的代码显然需要使用 ConfigAdmin 包(以处理存在 ConfigAdmin 服务的情况)...这意味着如果运行时不导出 ConfigAdmin 包,我的包将无法正确解析。
但我希望这个解决方案是可选的......所以我将其添加到 list 中:
org.osgi.service.cm;resolution:=optional;version="[1.5,2)"
现在,该包将解析,但会在运行时崩溃,并显示 java.lang.NoClassDefFoundError: org/osgi/service/cm/ManagedService
即使用户实际上不会使用 ConfigAdmin 进行配置。因此,这迫使用户安装 config-admin bundle 只是为了让我的 bundle 工作。
我想这里的 secret 是不要实例化任何强制 JVM 加载使用 org.osgi.service.cm
包的类的类...但我不知道如何实现我可以通过反射实现这一点,而无需丑陋的黑客......
有谁知道如何检查该包在运行时是否可用,如果不可用,请在运行时避免 java.lang.NoClassDefFoundError
,使此包依赖项真正可选?
最佳答案
判断包在运行时是否可用的方法是尝试从中加载类并为 NoClassDefFoundError 做好准备。您可以在中心位置执行此操作,然后决定避免需要可选但不存在的包的代码路径。
关于java - 如何创建具有可选包解析的工作 OSGi 包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37421604/