【问题标题】:CQ5. configure classloading. Why does CQ loses class metainformation (annotations)?CQ5。配置类加载。为什么 CQ 会丢失类元信息(注释)?
【发布时间】:2014-06-14 09:21:38
【问题描述】:

我们有 2 个不同的 OSGI 包。

在第一个包中存在将 JSON 字符串解析为 MyClass.MyClass 由 Gson 注释注释的类。MyClass 位于第二个包中。我有很多问题。最终在调试模式下我注意到了

MyClass.class.getDeclaredField("fieldName").getAnnotation(AnnotationType.class)

返回空值。

因此 CQ5 在某处丢失了注释。

我创建了一个全新的项目,将解析器类和 MyClass 复制到此。这段代码确实可以正常使用。

最终我们了解到“MyClass”和 Gson 是由不同的类加载器加载的,在我们开始加载 Gson 相同的类加载器后,问题已得到解决。但这是非常笨拙的解决方案。

你怎么看?

它如何更优雅地修复它?

【问题讨论】:

    标签: java osgi classloader aem apache-felix


    【解决方案1】:

    您的包可以从两个地方导入 GSON 依赖项:

    1. 它可以作为独立包放入 OSGi 容器中,
    2. 可以嵌入。

    为了找出在您的情况下哪个是正确的,请在 Apache Felix 控制台中打开包并在 Imported Packages 部分中查找 com.google.gson。如果它看起来像这样:

    com.google.gson,version=2.2.4 from com.google.gson (343)
    

    这意味着您的捆绑包从独立捆绑包 343 导入 GSON(案例 1)。另一方面,如果没有这样的条目,但你可以找到 GSON jar 名称:

    gson-2.2.4.jar
    

    Bundle Classpath 中,这意味着您将 GSON 嵌入到您的包中(案例 2)。

    您发现问题的原因是bundle1和bundle2中的GSON库是由不同的类加载器加载的。这意味着至少有一个包使用库的嵌入式版本(案例 2)而不是独立版本(案例 1)。为了解决这个问题,您需要在pom.xml 中查看maven-bundle-plugin<Embed-Depdency> 指令并从那里删除gson。您也可以尝试将 <dependencies> 部分中的 gson 范围更改为 provided

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 2021-01-18
      • 2017-01-18
      相关资源
      最近更新 更多