OSGi包无法启动 - 无法解析sun.reflect.generics.reflectiveObjects

ton*_*edz 3 java osgi apache-felix aem

在我的AEM项目的代码看似无关的变化之后,我的捆绑无法解决.检查日志后,我可以看到出现以下错误.

22.04.2015 11:00:18.650 *ERROR* [qtp1266495948-35]
org.apache.felix.http.jetty %bundles.pluginTitle:
Cannot start (org.osgi.framework.BundleException:
Unresolved constraint in bundle my-bundle
...
[caused by: Unable to resolve 401.121: missing requirement [401.121]
osgi.wiring.package; (osgi.wiring.package=sun.reflect.generics.reflectiveObjects)]]
Run Code Online (Sandbox Code Playgroud)

该项目在本地编译得很好,问题只发生在容器试图解决它的捆绑安装之后.

我没有在任何更改中添加任何显式依赖项.项目对象模型与以前相同.这个名字暗示这是一个核心Java包,所以我希望它可以被System bundle公开.

我正在运行JDK 7,这是由AEM支持的,所以不要指望它是JVM兼容性的问题.至少在涉及AEM内部时.

ton*_*edz 8

该包sun.reflect.generics.reflectiveObjects是JDK的一部分,但它不是Java API的一部分,如Oracle的Java 7兼容性文档中所述

这些sun.*不是受支持的公共接口的一部分.直接调用sun.*包的Java程序无法保证在所有兼容Java的平台上运行.实际上,即使在同一平台上的未来版本中,也不能保证这样的程序能够工作.

这解释了为什么包不是由Apache Felix(基础AEM)中的系统包导出的.一个非常合理的决定.本地编译的代码因为包在我的类路径中但在运行时失败了,这一切都很好并且可以预期.

我的代码首先不应该使用这个包.有两种可能的方法来引入对这些包的依赖.

  1. 出于某种原因使用使用这些类的库并引入传递依赖性.这不是发生的事情.

  2. 导入其中一个类 - 这是一件非常愚蠢的事情.如果有人使用课程,他们应该知道它是什么.

就我而言,我明确地从这个包中导入了一个类而没有注意到它.

事实证明,该sun.reflect.generics.reflectiveObjects包包含一个NotImplementedException类,它的名称与经常使用,恰逢NotImplementedExceptionapache.commons.lang3.

我在IDE中自动完成时意外导入了它并且很长时间没有注意到这一点.它花了我一个git bisect孤立的变化.

发生这种情况后,我sun.*从自动完成中排除了包.