15

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

我的问题是:社区中是否有人有更好的方法?我们做事的方式很有效,但我觉得它很慢而且效率很低,我敢打赌有人想出了更好的东西!

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

4

4 回答 4

9

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

watch 命令可用于在开发时提供帮助。它允许您配置一组将被监视的 URL。与给定 URL 匹配的所有捆绑包位置将自动更新。这避免了手动更新捆绑包甚至在需要时将捆绑包复制到系统文件夹的需要。请注意,只有基于 maven 的 url 和 maven 快照实际上会自动更新,所以如果你运行

开发:观看 *

它实际上将监视所有位置与 mvn:* 匹配且 url 中包含“-SNAPSHOT”的包。

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

类似的东西是PAX 插件

如果您有 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:使用 ServiceFactories?并链接到源代码:http ://dl.dropbox.com/u/2465717/net.earcam.example.servicecomponent_2011-08-16_15-52.tgz

于 2011-08-01T08:10:38.977 回答
3

我在 Eclipse 中使用 Equinox 取得了很好的效果——即使是热代码替换也能正常工作。当然,目标平台很小,我们自己只有大约 50 个捆绑包,但工作流程如下:

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

于 2011-07-30T00:44:09.700 回答
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 服务器上运行。

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

于 2012-04-24T22:55:47.837 回答
2

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

春分

Eclipse 对使用您选择的捆绑包启动 Equinox 具有出色的(或几乎是出色的)支持。您需要准备的两件事是:

  1. 正在开发的捆绑包,可作为插件项目在工作区中使用
  2. 目标平台,包含应用程序的剩余捆绑包

这样的设置将允许您轻松更改捆绑包,甚至是运行时,并在需要时轻松重新启动运行时。当您在远程系统上开发时,我认为 Karaf 更适合,其中捆绑包通过 SSH 或 FTP 部署,或者当您使用 Maven 等外部构建工具时,这些工具能够在构建包后在运行时自动复制捆绑包。

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

菲利克斯

Felix 似乎没有对从 Eclipse 启动的这种支持(尽管有一项针对此的工作,在此 Jira 问题中进行了跟踪)。您也可以将它作为普通的 Java 应用程序启动,但这很不方便。在这种情况下,使用 Maven 将是更好的选择。您仍然可以设置 Eclipse 以充分利用 PDE 的其他功能,只需在外部启动即可。

概括

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

于 2011-07-30T18:04:36.187 回答