使用 Maven 开发 OSGi 应用程序时,我应该先使用 POM 还是先使用 MANIFEST?

Posted

技术标签:

【中文标题】使用 Maven 开发 OSGi 应用程序时,我应该先使用 POM 还是先使用 MANIFEST?【英文标题】:Should I use POM first or MANIFEST first when developing OSGi application with Maven? 【发布时间】:2012-07-07 13:12:34 【问题描述】:

使用 Maven 开发 OSGi 应用程序有两种主要方法:POM-first 和 MANIFEST first。

我正在寻找以表格形式显示每种方法的优缺点的答案。

更具体地说,我也想知道它与:

工具集的成熟度 供应商独立性 易于开发(包括寻找可以进行工具开发的人员) 兼容性 避免 ClassNotFound 避免体力劳动

【问题讨论】:

“我们在这里播放两种音乐......乡村西部。”换句话说,您设置了错误的二分法,并且选择比“POM first”和“MANIFEST first”更多。您是否特别关注过 Bndtools IDE? 这个问题显然属于招揽辩论和争论的范畴,应该关闭。 我只知道两种处理方法:maven-bundle-plugin 和 tycho-maven-plugin。我现在正在将我的 Eclipse 插件转换为使用 Tycho,所以我有一个“真正的”理由来使用它。我的参考 OSGi 应用程序不是基于 Eclipse 的,它使用的是 Felix。到目前为止,我在使用 Tycho 时看到了更多的缺点。 【参考方案1】:

目前这是我能想到的

POM-First Pros(使用 maven-bundle-plugin)

利用现有的 Maven 技能、存储库和工具。 可能更容易找到知道如何管理 pom.xml 而不是 MANIFEST.MF 和 pom.xml 的人 MANIFEST.MF 中的大部分信息都可以从 pom.xml 本身获取。 可以与其他 IDE 一起工作,而不仅仅是基于 Eclipse 的。 侵入性较小,只需添加single插件并将打包类型更改为“bundle”

POM 优先缺点

ClassNotFoundException 更有可能在运行时发生。但是,可以使用 pax-exam 来缓解这种情况(尽管设置起来非常复杂)。 仍然需要了解如何设置 MANIFEST 以确保正确设置 instructions 配置元素。

MANIFEST-first Pros(使用 tycho-maven-plugin)

似乎是推荐的方法,或者至少被称为推荐的方法,但我真的不明白为什么它有显着的好处。 (因此问这个问题的原因)。 适合开发 Eclipse 插件并与 PDE 很好地集成 提供用于测试的工具,从而允许ClassNotFoundException 在 JUnit 测试期间而不是运行时出现。

清单优先的缺点

似乎只在基于 Eclipse 的 IDE 上运行良好。您不必使用 Eclipse,但如果没有 PDE,您会想要吗? 违反 DRY 原则,因为我必须让 POM 和 MANIFEST.MF 中的名称和版本保持同步。 需要以特定方式命名事物 您不能混合使用,这意味着现有的 Maven 多项目安装不能仅仅添加 OSGi 支持 与 maven-bundle-plugin 相比,需要更多配置才能获得更少的警告:http://wiki.eclipse.org/Tycho/Reference_Card#Examplary_parent_POM 必须使测试用例成为一个单独的项目。在 src/test/java 中构建时不会运行。 似乎它只会测试公开的类,即“.internal”中的类。不可测试。

如果有人要求我推荐一个已经在使用 Maven 并希望迁移到 OSGi 的企业,那么我会首先选择 POM

如果我被要求推荐一个正在做 Eclipse 插件开发的人,那么它是 Manifest first -- with tycho

【讨论】:

有没有办法从 MANIFEST.MF 生成 POM 依赖项? Tycho 提供了这样的功能。它还可以保持版本同步。【参考方案2】:

我认为您应该根据用例进行选择。对于服务器端 OSGi 项目,我更喜欢 pom first 风格。它很好地匹配了 maven 构建,并且比 Manifest first 更不容易出错。 事实上,maven bundle 插件背后的 bnd 在大多数情况下无需任何额外配置即可获得 Manifest 权限。诀窍是使用一些命名规则。例如,如果您将内部包命名为 impl 或 internal,则不会导出。使用这种风格你不能使用 Eclipse 插件透视图(至少没有我不喜欢的 bndtools),但我还没有错过这个透视图。我是 Apache Karaf、CXF 和 Camel 项目的开发人员,我们使用这种风格并且效果很好。特别是对于 CXF 和 Camel,我们可以使用相同的构建和工具支持 OSGi 和非 OSGi 部署,这非常棒。

对于 Eclipse RCP 应用程序,首先要使用清单,因为您需要插件透视图和 Eclipse IDE 工具。如果你想将它与 maven 结合起来,那么 tycho 可能是要走的路。

【讨论】:

我发现完全一样的事情是真的。我也开发了这两种方法,并在适当的时候继续这样做。这就是我们在 RCP 代码中使用 Tycho 的原因,因此我们仍然可以使用 maven,但它通过使清单为王,可以更轻松地在 Eclipse 中为 RCP 开发。 谢谢,你的结论和我的一致,实际上你的结论是我在写这个问题之前就想到的。提出这个问题的原因是列出每种方法的优缺点,以防我必须证明我为什么选择一个而不是另一个。【参考方案3】:

MANIFEST 首先不会将您锁定到 Eclipse(尽管如果超过极少数人会使用其他任何东西,我会感到惊讶)。 MANIFEST 是重要的文件,需要添加到 jar 中,无论您如何执行此操作。

另一方面,POM 首先将你完全锁定在 Maven 中,你失去了 OSGi 包是一个常规 jar 的优势,你可以按照你想要的方式制作。

我都试过了,我真的更喜欢 MANIFEST 首先。 MANIFEST 文件是一个非常重要的文件,我更喜欢制作该文件而不是制作生成该文件的文件。如果发生了一些奇怪的事情,(并且它会在某个时候)首先检查 MANIFEST 文件,如果它是您自己的文件会更容易。此外,无论如何您都必须熟悉它。

所以,如果 Maven 是您的 alpha 和 omega,那么 POM 首先最适合您,但您仍然需要深入了解 MANIFEST 文件。

【讨论】:

我完全不同意这个立场,生成 MANIFEST 比手动维护它要好得多,因为它包含太多重复的信息(例如导入的包)。关于它非常重要的论点是虚假的,因为您的应用程序中的 .class 文件也非常重要,您不会梦想手动编写这些文件。 有趣。我并不反对生成 MANIFEST 文件,我只是说无论如何你都需要熟悉它。通过查看 MANIFEST 文件,可以解决或分析 *** 上出现的许多问题。我从未见过有人请求字节码。两者确实有不同的作用。无论如何,我期待你的回答。 是的..你必须知道你的清单应该是什么样子。当您生成清单时,您仍然需要检查它是否正常工作,但您的手动工作要少得多。所以我也支持宁愿生成 Manifest。 @FrankLee 如果您正在手动编辑 Manifest,如何确保正确获取所有版本和“使用”指令?听起来很容易出错... @FrankLee 聚会时间! First comment, first sentence: "Have you checked the bytecode?"。 ;)

以上是关于使用 Maven 开发 OSGi 应用程序时,我应该先使用 POM 还是先使用 MANIFEST?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 maven 项目轻松部署到 Karaf Osgi 容器

在 OSGi 包中添加第三方 Maven 依赖项的最佳方法

如何使用 Maven 将第 3 方 OSGi 捆绑包添加到部署包中?

在集成 Maven、Tycho 和 Eclipse 时处理非 OSGi 依赖项

使用 OSGI 从 Ant 迁移到 Maven?

如何在清单文件中包含 Maven 依赖项