MANIFEST 文件是如何在我的 AEM osgi 包中生成的?

How the MANIFEST file is being generated in my AEM osgi bundle?

我用 aem-project-archetype 版本 13 创建了一个 Maven 项目。 将捆绑包安装到 AEM 后,我在 felix 控制台中收到 3 个导入捆绑包 could not be resolved 的错误。 我试图找出这些内容是从哪里被包含到我的 target/MANIFEST 文件夹内的清单文件中的。 这样我就可以修改各个包的版本了。

我在 felix 控制台中遇到的错误,我的包处于已安装状态,未激活

org.apache.sling.api.resource,version=[2.10,3) -- Cannot be resolved
org.apache.sling.api.servlets,version=[2.2,3) -- Cannot be resolved
org.apache.sling.models.annotations,version=[1.4,2) -- Cannot be resolved

这些导入基于您编译的代码。没有一些讨厌的小花絮会缠着你。它们的目的是验证您 运行 所针对的内容与您编译的内容是否兼容。我假设 运行time 的版本低于您的要求。这意味着您在 Maven 中设置的编译路径具有比您的 运行time 更高的版本。如果您可以 运行 您的代码,您可能会 运行 进入 Class 未找到异常或没有此类方法错误。

也许不是。但是你可能会遇到更糟糕的情况,事情不正确(编译期间做出的承诺可能无法实现)并且问题可能会在损坏完成后很久才发生。

这些东西是有充分理由的。它们就像插头上的接地针,它们保护你。

如何解决这个问题?看看你的依赖关系。您必须确保针对低于或等于 运行 时间中存在的版本进行编译。您可以先查看 POM 中的版本。如果没有这些版本,请查看 Maven 使用的编译路径。

替换清单中的数字就像锯掉插头上的接地针,否则它就无法安装在墙上……坏主意。

当您开发 AEM 应用程序时,OSGI 包(和清单)通常是通过 Felix maven-bundle-plugin.

该插件根据您在所有 Java 代码中导入的 java 包编写您的包 imports。如果您从 Maven 依赖项导入,请说 Sling 该导入的版本将是来自 Sling.

的包版本

您在这里遇到的问题可能是两个问题之一

  1. 您正在导入的包在 OSGI(AEM 实例)中不存在
  2. 您的 Maven 依赖项中的版本与 OSGI(AEM 实例)中的版本不匹配。因此 OSGI 无法解析您正在导入的版本。

2. 很可能是这种情况,因为 sling 始终与 AEM 捆绑在一起。

你能对debug/fix做什么?

  1. 你可以去http://localhost:4502/system/console/depfinder 并在那里尝试您的包以查看实际导出的版本 在 OSGI 中。
  2. 检查 pom.xml 中依赖项的版本 并确保 OSGI 版本在指定的范围内 清单进口。您可以使用 maven dependency tree 列出所有 您的依赖项及其版本。
  3. 这特定于 AEM,如果您使用 uber-jar 请确保您是 为正确的 AEM 实例使用正确的版本 运行.

Note that in manifest imports the range [2.10,3) means it accepts all versions between 2.10.0 and 3.0.0 but NOT including 3.0.0. In my experience, Maven bundle plugin will always write the range where the min is your maven dependency package version and the max is the next major version.

手动更改导入:

不推荐这样做,并且有非常具体的用例,但您可以手动告诉捆绑插件将哪个版本添加到导入中。请参阅捆绑插件文档中的 import-package instruction