高效的OSGi开发工作流程

时间:2011-07-30 00:15:45

标签: java eclipse osgi maven-3 apache-karaf

我处理的产品由许多捆绑包组成,这些捆绑包作为karaf顶部的功能运行。通常,我们的开发人员一次只能处理一个捆绑包。我们的正常开发类似于:代码,编译,复制捆绑到部署文件夹,测试。我们还发现hotdeploy只是拒绝覆盖某些作为功能安装的捆绑包,而无需重新启动服务器或卸载/重新安装功能,因此有时循环时间会更长。

我的问题是:社区中的任何人都有更好的方法吗?我们做事的方式有效,但我觉得它很慢而且效率低下,而且我打赌有人提出了更好的方法!

编辑:我意识到在我的问题中我很不清楚...我们在Karaf下使用Equinox。我们也使用Eclipse和Maven,虽然我不知道使用Maven是相关的。

4 个答案:

答案 0 :(得分:9)

听起来你想要 dev:watch 命令。来自文档:

  

watch命令可用于帮助开发时间。它允许您配置一组将被监视的URL。与给定URL匹配的所有捆绑包位置都将是           自动更新。这样就无需手动更新软件包,甚至可以根据需要将软件包复制到系统文件夹。请注意,只有基于maven的网址和maven快照才会自动更新,因此如果您运行

     

dev:watch *

     

它实际上会监控所有位置匹配mvn:*的包,其网址中包含“-SNAPSHOT”。

从Karaf shell中执行“dev:watch --help”将列出其可用的标志和参数。

类似的东西是PAX plugin

如果你有Eclipse的m2 maven插件,其中任何一个都能很好地工作。

更新:在我的公司,我们努力成为TDD,因此在没有明确启动Karaf的情况下进行了大量的开发。在单元测试的正常组合中,我们也使用Pax Exam,即使从Eclipse中运行,这在很大程度上也很棒。)

这有助于确保我们不会因为使用Equinox / Felix / Concierge运行任何Karaf细节(因此我模拟了我们依赖的各种Karaf细节,如JAAS身份验证)。除了许多其他很酷的工具/功能外,它还能够配置Karaf功能并使用TinyBundles,您甚至可以动态创建捆绑包(再次用于模拟/存根)。

Pax Exam通过提供JUnit @Runner挂钩到JUnit框架,最新版本(2)更快,并且具有基于DSL的API,因此测试非常简洁和可读。

使用Pax Exam为我们提供了良好的测试覆盖率和较短的开发时间。如果测试不太实际,或者我们正在寻找测试中没有出现的错误,那么dev:watch命令是非常宝贵的。

总结; IMO你绝对应该通过测试推动你的开发(Pax Exam将很好地插入你现有的构建中,一旦你习惯了它,你会发现更快的开发)。您可以立即开始使用 dev:watch 命令,这肯定会加快您当前的状况。

更新2:在回答另一个问题时,我添加了一个maven示例Pax-Exam测试ComponentFactory。测试驱动开发可以说是当今开发人员可以使用的最有效的工作流程。链接到问题:osgi: Using ServiceFactories?并链接到源代码:http://dl.dropbox.com/u/2465717/net.earcam.example.servicecomponent_2011-08-16_15-52.tgz

答案 1 :(得分:3)

如果您使用Eclipse Eclipse Libra可能对您有用。 Libra可以在Eclipse中启动Felix,Equinox和Knopflerfish作为任何其他具有WST的服务器。他们有一些YouTube视频如何使用它。

我还写了一些可以提供帮助的工具:

  • 一个osgi包,它获取与过滤器匹配的OSGI服务(osgitest = junit4)。这样你就不会编写Junit类,但可以提供预先配置的对象(例如,使用OSGI Blueprint)。 JUnit比基于服务实现的接口中提供的注释运行。
  • 具有以下有用目标的maven插件
    • 启动一个OSGI容器,并使用它的所有依赖项(当然是OSGI包)部署bundle maven项目。 OSGI容器启动是在PAX Exam的帮助下完成的,但JUnit测试是在我编写的OSGI包的帮助下启动的(运行您可能提供的OSGI服务)。
    • 创建一个文件夹,其中包含项目所有依赖项的快捷方式(位于文件夹的maven repo或目标目录)

如果将项目部署到服务器(Eclipse Libra)上,我只需说更新X,其中X是捆绑包的ID,所有内容都会快速刷新。如果在Libra中运行Equinox,则不必重新编译发布到服务器的项目,因为它指向目标类文件夹,该文件夹会在您保存类或pom.xml后立即刷新。

如果您没有将项目发布到服务器上,而是将其作为捆绑包添加到指向快捷方式文件夹的容器中,则还可以在运行mvn install后在OSGi控制台上运行update命令(无需重新启动服务器)

http://cookbook.everit.org/

提供了分步指南

使用上面的方法,可以将测试编写为TDD测试,并将其作为CI服务器上maven编译的一部分运行。

我希望你会发现这些工具和我一样有用!

答案 2 :(得分:2)

我在Eclipse中使用Equinox获得了出色的结果 - 即使热代码替换也能正常工作。已经批准,目标平台很小,我们只有大约50个自己的捆绑包,但工作流程是这样的:

首先,我们有一个包含所有第三方和Eclipse捆绑包的目标平台,Eclipse负责下载&管理他们。然后,工作空间包含项目的所有包,分组为3-4个工作集。编译在保存时照常进行,有时GWT需要重新编译,但即使这样,更改也会立即获取,因为不需要进行部署 - 运行的Equinox系统使用解压缩的项目文件夹作为捆绑包。从Eclipse中运行它可以让我们热门代码替换,即时更改模板文件,只需要刷新MANIFEST.MF / plugin.xml更改 - 即使这样,重新启动框架通常比输入更快控制台。

答案 3 :(得分:2)

这取决于Karaf下的平台:Felix或Equinox。

<强>春分

Eclipse拥有出色的(或几乎优秀的)支持,可以使用您选择的捆绑软件启动Equinox。你需要准备的两件事是:

  1. 正在开发的捆绑包,可作为插件项目在工作区中使用
  2. 目标平台,包含应用程序的剩余捆绑包
  3. 此类设置将允许您轻松更改捆绑包,甚至是运行时,并在需要时轻松重新启动运行时。当您在远程系统上进行开发时,我看到Karaf更合适,其中捆绑包是通过SSH或FTP部署的,或者当您使用外部构建工具(如Maven)时,它们能够在构建后自动在运行时复制捆绑包。

    如果您正在使用Equinox,这将提供一些额外的优势,因为运行时将直接从工作区执行代码。

    <强>菲利克斯

    Felix似乎没有从Eclipse启动这样的支持(虽然有一项工作,在this Jira issue中跟踪)。您也可以将它作为普通的Java应用程序启动,但这远非方便。在这种情况下,使用Maven将是更好的选择。您仍然可以设置Eclipse以充分利用PDE的其他功能,只有外部启动才能完成。

    <强>摘要

    总之,您可以随时通过Maven自动化一切,而Karaf将在这方面为您提供极大的帮助。如果您使用Equinox,Eclipse将有一点优势。无论您使用哪种方法,都应该能够替换热代码,因为热代码替换根本不考虑OSGi(除非在唯一的情况下,当您重新加载捆绑包并创建新的类加载器时)。