java - 如何创建具有可选包解析的工作 OSGi 包?

标签 java osgi

我希望我的包可以通过系统属性或通过 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/

相关文章:

java - 帕克斯考试 2 : gave up waiting for service

java - 复选框节点树,自定义渲染器

java - 带有 chromedriver 的 Selenium 根据 "headless"参数给出不同的结果

java - 在 POM 中的 Maven 存储库条目中,是否默认启用快照?

java - ServiceTracker有时会错过服务?

java - 根据系统设置选择要加载的 native 库

java - 有没有可能用camel监听sql表/字段?

java - 异常: "No default Constructor provided" exception subclassing ParseObject

java - 是否可以从 Java 调用 BlazeDS?

java - 调试 PAX-Exam 测试中的 ClassNotFound 问题