如何管理OSGi构建依赖关系?
我们已经将OSGi运行时(Equinox)嵌入到自定义的客户端-服务器应用程序中,以方便插件开发,到目前为止,一切都很好。由于内置清单清单编辑器,依赖项管理和导出向导,我们一直在使用Eclipse构建插件。使用Eclipse进行管理器构建不利于通过Hudson进行持续集成。
我们有依赖于其他OSGi捆绑包的OSGi捆绑包。我真的很讨厌在自定义ANT构建中对构建顺序进行硬编码。我们已经做到了这就是过去,这简直太可怕了。如果没有自动解决OSGi依赖关系,是否有任何构建工具可以轻松管理OSGi依赖关系?是否有关于此的DECENT示例?
澄清:
生成的构建脚本只能通过Eclipse使用。他们需要手动运行Eclipse。我们还提供了一些Eclipse构建所没有的标准目标,并且我不想修改生成的文件,因为我可能会重新生成(我知道我可以做包括在内,但是我想避免所有Eclipse gen文件一起)
这是我的项目布局:
/ -PluginA -PluginB -PluginC . . .
在使用Eclipse PDE时,每个插件都有一个Manifest,但是没有build.xml,因为PDE为我做了。使用Hudson很难自动化GUI驱动的过程。我想设置自己的build.xml来构建每个,但是存在依赖关系和构建顺序问题。这些问题是由清单文件(描述OSGi导入)驱动的。例如,PluginC依赖于PluginB,而后者依赖于PluginA。它们必须以正确的顺序构建。我意识到我可以手动控制构建顺序,因此我正在寻找一种工具来帮助自动化构建顺序依赖性管理。
解决方案
回答
我们使用巴克敏斯特。这是一个构建和组装框架,负责解决依赖项的解析,从各个存储库中获取数据,构建和包装产品。
这是一个Eclipse Tools项目。它与PDE集成良好。
这意味着我们用于构建RCP的所有元数据对Buckminster进行解析和构建非常有用。例如,feature.xml和Manifest.MF.product中的Require-Bundle标头。
现在每个捆绑包中都没有任何构建脚本。现在,每个产品只有一个版本。 Buckminster小心行走依赖图。
尽管他们(Buckminster团队)已经开始使用Hudson来托管项目本身,但是花了点力气才能使我们现有的巡航控制/蚂蚁系统与之配合使用。我相信他们的构建设置也可以下载。
尽管它还处于起步阶段,但它确实给我们留下了深刻的印象。
我们也研究了Pax-Construct,但是我们不想使用Maven。
我们目前还正在研究Spring DM测试框架,以增加单元测试的工作量。
回答
Maven2一路走来;有一个名为m2eclipse的Eclipse插件可以帮助管理它,可以完全解决依赖问题,然后解决一些问题。有一本免费的在线书籍作为文档。
专门研究将多个组件捆绑在一起的多模块项目,并让Maven制定出构建顺序和依赖项。
还有关于Eclipse集成的一章。
那只是Eclipse和Maven,接下来我们将获得一些适用于OSGi的好东西:
- Apache Felix BND Maven插件将自动生成清单,或者至少会为我们提供帮助
- PAX OPS4J项目及其Maven插件可以在引导项目,提供启动器等方面提供巨大帮助
从根本上说,Maven模块模型与OSGi的捆绑软件模型完全吻合。三年多来,我们一直在使用Maven构建和管理具有数百个捆绑包的多种产品,这很棒。
回答
我们能详细说明出现问题的地方吗?我们提到了OSGi捆绑包依赖性。这是在运行时吗?还是在编译时?在第一种情况下,我们应考虑声明式服务(请参阅OSGi规范)。
回答
我们将Hudson与PluginBuilder结合使用来构建基于Eclipse的OSGi捆绑软件/插件。这是基于Eclipse的标准PDE流程来构建插件的。这意味着使用Eclipse作为编译器。
回答
调教Maven2. 查看Tycho插件以使用Eclipse的JDT编译器进行构建,以便它在编译时实现所有OSGi规则,就像Eclipse在运行时一样。
另外,Apache Felix BND插件似乎也很流行。我喜欢Tycho,因为它似乎更紧密地统一了Maven和Eclipse开发环境。
回答
解决一些老问题...
由于缺乏网络连接和时间安排,我们的设置不利于Maven。我知道有离线的Maven设置,但考虑到时间,一切都太多了。希望当我们有时间重组构建过程时,将使用适当的设置。
该解决方案涉及Ant,BND和一些自定义ant任务。各种捆绑包依赖关系是手动管理的。我们已经在使用Ant; BND和自定义任务将它们捆绑在一起。自定义任务只是确保我们的bnd / eclipse项目是同步的。
回答
PDE无头构建。 Eclipse对其进行了充分的记录。如果我们要构建Eclipse插件,并且想通过命令行来实现,那么Eclipse PDE无头构建就是最佳选择。