OSGi捆绑包不会启动 - 无法解析sun.reflect.generics.reflectiveObjects

时间:2015-04-25 13:12:28

标签: java osgi cq5 aem apache-felix

在我的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)]]

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

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

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

1 个答案:

答案 0 :(得分:8)

sun.reflect.generics.reflectiveObjects是JDK的一部分,但它不是Java API的一部分,如Oracle's documentation for Java 7 compatibility中所述

  

sun.*个包不属于受支持的公共界面。   直接调用sun.*包的Java程序无法保证在所有兼容Java的平台上运行。实际上,即使在同一平台上的未来版本中,也不能保证这样的程序能够正常工作。

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

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

  1. 出于某种原因使用使用这些类的库并引入传递依赖性。事情并非如此。

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

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

    事实证明,sun.reflect.generics.reflectiveObjects包中包含NotImplementedException类,其名称与NotImplementedException中经常使用的apache.commons.lang3一致。

    我在IDE中自动完成时意外导入了它并且很长时间没有注意到这一点。我花了git bisect来隔离变化。

    发生这种情况后,我从自动填充中排除了sun.*个包。