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

19

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

方法 优点 缺点
POM-first 易于管理依赖性;更好的可重用性;更容易维护版本; 需要手动配置MANIFEST.MF文件;可能难以控制输出JAR包内容
MANIFEST-first 不需要额外配置文件;支持所有OSGi功能 需要手动处理依赖关系;不够灵活;难以与其他构建系统集成

具体而言,我还想知道它与以下内容的关系:

  • 工具集的成熟度
  • 供应商独立性
  • 开发容易程度(包括寻找能够使用工具进行开发的人员)
  • 兼容性
  • 避免ClassNotFoundException
  • 避免手动工作

我们在这里播放两种音乐...乡村和西部。换句话说,您提出了一个错误的二元对立,除了 "POM first"和" MANIFEST first "之外还有更多选择。特别是,您是否已经看过Bndtools IDE? - Neil Bartlett
1
这个问题显然属于征求辩论和争论的范畴,应该被关闭。 - Robin
我只知道两种处理这个问题的方法:maven-bundle-plugin和tycho-maven-plugin。我现在正在将我的Eclipse插件转换为使用Tycho,所以我有一个“真正”的理由去使用它。而我的参考OSGi应用程序并非基于Eclipse,而是使用Felix。到目前为止,我在使用Tycho时看到了更多的缺点。 - Archimedes Trajano
3个回答

20

目前这是我能想到的:

POM-First 优点(使用 maven-bundle-plugin)

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

POM-First 缺点

  • 在运行时更容易发生 ClassNotFoundException。但是,可以通过 pax-exam 来缓解此问题(尽管设置非常复杂)。
  • 仍然需要了解 MANIFEST 的设置,以确保正确设置了 instructions 配置元素。

MANIFEST-first 优点(使用 tycho-maven-plugin)

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

MANIFEST-first 缺点

  • 似乎只适用于基于 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 first开始。

    如果有人正在进行Eclipse插件开发,则推荐使用Manifest first -- with tycho


    有没有一种方法可以从MANIFEST.MF生成POM依赖项? - Nicolas Rouquette
    Tycho提供了这样的功能。它还可以保持版本同步。 - Balz Guenat

    6
    我认为你应该根据使用情况来选择。对于服务器端的OSGi项目,我更喜欢先使用pom的风格。它很好地匹配了Maven构建,并且比Manifest first少出现了很多错误。
    实际上,maven bundle插件背后的bnd在大多数情况下都能正确处理清单而无需任何其他配置。诀窍在于使用一些命名规则。例如,如果您将内部包命名为impl或internal,则不会被导出。使用这种风格,您不能使用Eclipse插件透视图(至少没有bndtools),但我还没有错过这个透视图。我是Apache Karaf、CXF和Camel项目中的开发人员,我们使用这种风格,效果很棒。特别是对于CXF和Camel,我们可以使用相同的构建和工具支持OSGi和非OSGi部署。
    对于Eclipse RCP应用程序,Manifest first是最好的选择,因为您需要插件透视图和Eclipse IDE工具。如果您想将其与maven结合使用,那么tycho可能是最好的选择。

    我发现确实如此。我也使用过这两种方法进行开发,并在适当的时候继续使用。这就是为什么我们在RCP代码中使用Tycho,这样我们就可以继续使用maven,但它允许更轻松地在Eclipse中开发RCP,因为它使清单成为王者。 - Robin
    谢谢,你的结论与我的相同,实际上你的结论是我在写这个问题之前就已经想到了。提出这个问题的原因是为了列出每个选项的利弊,以便在必须为选择其中一个进行辩解时使用。 - Archimedes Trajano

    0

    首先,MANIFEST并不限制您使用Eclipse(尽管我会惊讶地发现除了微小的少数人之外,其他人都在使用它)。MANIFEST是计数的文件,并且需要添加到jar中,无论您如何执行。

    另一方面,POM完全将您锁定在Maven上,您失去了OSGi捆绑包是常规jar的优势,您可以按照任何方式进行制作。

    我已经尝试过两种方法,我真的更喜欢MANIFEST。 MANIFEST文件是一个非常重要的文件,我更喜欢制作该文件而不是制作生成该文件的文件。如果发生奇怪的事情(在某个时候会发生),MANIFEST文件是第一个要检查的文件,如果是您自己的文件,那就更容易了。此外,您仍然需要熟悉它。

    因此,如果Maven是您的全部和终极目标,那么POM将最适合您,但是您仍然需要深入了解MANIFEST文件。


    5
    我对这种观点完全不同意,生成清单比手动维护要好得多,因为它包含了大量重复的信息(例如导入的包)。关于它非常重要的论点是虚假的,因为应用程序中的.class文件也非常重要,您不会梦想手写这些文件。 - Neil Bartlett
    有趣。我并不反对生成 MANIFEST 文件,我只是在说你无论如何都需要熟悉它。许多在 stackoverflow 上出现的问题可以通过查看 MANIFEST 文件来解决或分析。我从未见过有人要求字节码。这两者确实有不同的作用。无论如何,我期待着您的答复。 - Frank Lee
    1
    是的..你必须知道你的清单应该长什么样子。当你生成清单时,你仍然需要检查它是否正常工作,但是你的手动工作要少得多。因此,我也支持生成清单。 - Christian Schneider
    2
    @FrankLee 如果你手动编辑清单文件,你如何确保你正确获取所有版本和“uses”指令?听起来非常容易出错... - Puce
    @FrankLee 是时候聚会了!第一条评论,第一句话:“你检查过字节码了吗?” ;) - Gerold Broser

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接