高效的 OSGi 开发工作流程
Posted
技术标签:
【中文标题】高效的 OSGi 开发工作流程【英文标题】:Efficient OSGi development workflow 【发布时间】:2011-10-16 08:27:02 【问题描述】:我正在开发一个产品,该产品由许多在 karaf 之上作为功能运行的捆绑包组成。通常,我们的开发人员一次只处理一个捆绑包。我们的正常开发是这样的:代码,编译,将包复制到部署文件夹,测试。我们还发现 hotdeploy 只是拒绝覆盖作为功能安装的某些捆绑包,而无需重新启动服务器或功能卸载/重新安装,因此有时周期更长。
我的问题是:社区中是否有人有更好的方法?我们做事的方式很有效,但我觉得它很慢而且效率很低,我敢打赌有人想出了更好的办法!
编辑:我意识到我的问题很不清楚......我们在 Karaf 下使用 Equinox。我们也使用 Eclipse 和 Maven,虽然我不知道使用 Maven 是否相关。
【问题讨论】:
我目前正在测试这些答案。它们都非常棒,在我接受之前,我想看看哪个最适合我。 抱歉让您久等了!我玩弄了所有这些答案,我最喜欢 dev:watch。它需要最少的工作(这意味着人们会实际使用它)并且它可以满足我们的需要。最终,我不认为每次我点击保存时我都希望 eclipse 重新编译和重新部署......我会说大约 95% 的时间我点击保存,我的代码不处于工作状态。我不得不说我很享受点击编译并看到新编译的包自动神奇地在我的服务器上运行! :) 我同意。这也是我采用的方法,但使用 IDEA。它还鼓励我让我的捆绑包包含更少的服务,这样它们就不会花费很长时间来重新加载。这也是一个很好的抽查你的包之间是否有加载顺序依赖关系! 【参考方案1】:听起来你想要 dev:watch 命令。来自文档:
watch 命令可用于在开发时提供帮助。它允许您配置一组将被监视的 URL。与给定 URL 匹配的所有捆绑包位置将是 自动更新。这避免了手动更新捆绑包甚至在需要时将捆绑包复制到系统文件夹的需要。请注意,只有基于 maven 的 url 和 maven 快照实际上会自动更新,所以如果你运行
开发者:观看 *
它实际上会监控所有位置与 mvn:* 匹配且 url 中包含“-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:在回答另一个问题时,我添加了一个测试 ComponentFactory 的 maven 示例 Pax-Exam。测试驱动开发可以说是当今开发人员可用的最有效的工作流程。问题链接:osgi: Using ServiceFactories? 和源代码链接:http://dl.dropbox.com/u/2465717/net.earcam.example.servicecomponent_2011-08-16_15-52.tgz
【讨论】:
专门用于 Karaf-Eclipse 集成,这可能很有用:code.google.com/a/eclipselabs.org/p/eik【参考方案2】:我在 Eclipse 中使用 Equinox 取得了优异的成绩——即使是热代码替换也能正常工作。当然,目标平台很小,我们自己只有大约 50 个捆绑包,但工作流程是这样的:
首先,我们有一个包含所有第三方和 Eclipse 包的目标平台,Eclipse 负责下载和管理它们。然后,工作区包含项目的所有包,分为 3-4 个工作集。编译在保存时照常进行,有时需要重新编译 GWT,但即便如此,更改也会立即被拾取,因为不需要进行部署 - 正在运行的 Equinox 系统使用解压缩的项目文件夹作为包。从 Eclipse 中运行它可以为我们提供热代码替换、即时更改模板文件、只有 MANIFEST.MF/plugin.xml 更改需要刷新包 - 即使这样,重新启动框架通常比输入更快控制台。
【讨论】:
问题是关于 Karaf+Maven 而不是 Equinox/P2/EclipsePlugins【参考方案3】:如果您使用 Eclipse,Eclipse Libra 可能对您有用。 Libra 可以像使用 WST 的任何其他服务器一样在 Eclipse 中启动 Felix、Equinox 和 Knopflerfish。他们有一些 youtube 视频如何使用它。
我还写了一些可以提供帮助的工具:
一个 osgi 捆绑包,用于拾取匹配过滤器 (osgtest=junit4) 的 OSGI 服务。这样您就不必编写 Junit 类,但您可以提供预配置的对象(例如,使用 OSGI 蓝图)。 JUnit 会根据您的服务实现的接口中提供的注释运行。 具有以下有用目标的 maven 插件 启动一个 OSGI 容器并部署 bundle maven 项目及其所有依赖项(当然是 OSGI 包)。 OSGI 容器的启动是在 PAX 考试的帮助下完成的,但 JUnit 测试是在我编写的 OSGI 包(运行您可能提供的 OSGI 服务)的帮助下启动的。 创建一个文件夹,其中包含项目所有依赖项的快捷方式(位于文件夹的 maven repo 或目标目录)如果项目部署到服务器(Eclipse Libra)上,我只需要更新 X,其中 X 是捆绑包的 id,并且所有内容都会快速刷新。如果您在 Libra 中运行 Equinox,则无需重新编译发布到服务器的项目,因为它指向目标类文件夹,该文件夹会在您保存类或 pom.xml 后立即刷新。
如果您不将项目发布到服务器上,而是将其作为捆绑包添加到指向快捷方式文件夹的容器中,您还可以在运行 mvn install 后在 OSGi 控制台上运行更新命令(无需重新启动服务器) .
可通过http://cookbook.everit.org/获取分步指南
使用上面的以下方法,可以将测试编写为 TDD 测试,并将它们作为 maven 编译的一部分在 CI 服务器上运行。
我希望您会发现这些工具和我一样有用!
【讨论】:
【参考方案4】:取决于 Karaf 下的平台:Felix 或 Equinox。
春分
Eclipse 对使用您选择的捆绑包启动 Equinox 具有出色的(或几乎是出色的)支持。您需要准备的两件事是:
-
正在开发的捆绑包,可作为插件项目在工作区中使用
目标平台,包含应用程序的剩余捆绑包
这样的设置将允许您轻松地更改您的包,甚至是运行时,并在需要时轻松地重新启动运行时。当你在远程系统上开发时,我认为 Karaf 更适合,其中包通过 SSH 或 FTP 部署,或者当你使用 Maven 等外部构建工具时,它能够在构建后在运行时自动复制包。
如果您使用的是 Equinox,这将提供一些额外优势,因为运行时将直接从工作区执行代码。
菲利克斯
Felix 似乎没有对从 Eclipse 启动的这种支持(尽管有一项针对此的工作,在 this Jira issue 中跟踪)。您也可以将它作为普通的 Java 应用程序启动,但这很不方便。在这种情况下,使用 Maven 将是更好的选择。您仍然可以设置 Eclipse 以充分利用 PDE 的其他功能,只需在外部启动即可。
总结
总而言之,您始终可以通过 Maven 将所有事情自动化,而 Karaf 将在这方面为您提供极大的帮助。如果您使用的是 Equinox,Eclipse 会提供一点优势。无论您使用哪种方法,您都应该能够进行热代码替换,因为热代码替换甚至根本不考虑 OSGi(除非在唯一的情况下,当您重新加载包并创建新的类加载器时)。
【讨论】:
这不太正确 - 1) 启动 Karaf 与启动 Karaf 封装的 Equinox/Felix 框架不同(Karaf 添加了许多功能),2) 使用 Maven 插件无论 Karaf 是否配置为使用 Equinox/Felix,Eclipse 都可以工作 - 在这种情况下使用 Equinox 没有任何优势。 1) 这取决于您使用 Karaf 的目的以及他是否需要此额外功能。如果您放弃 Karaf 添加的这个功能,那么如果您使用的是 Equinox,那么您将与 Eclipse 有更好的集成。在菲利克斯的情况下,什么都不会改变。 2) 我并不是说当你有基于 Maven 的工作流和 Equinox 时 Eclipse 可以提供帮助,我的意思是如果平台是 Equinox,基于 Eclipse 的工作流会比基于 Maven 的工作流更好,因为 Felix 没有集成在 Eclipse 中。 我不是在抨击你,只是想澄清一下 Karaf以上是关于高效的 OSGi 开发工作流程的主要内容,如果未能解决你的问题,请参考以下文章
YouTube API - Oauth2 流程(OSGI 捆绑包)