如何在Karaf上处理频繁的本地快照包部署?

19

我决定基于OSGI和Karaf构建一个应用程序 - 我真的很喜欢这个东西。然而,我在本地开发机上每天部署都有点困难。我的意思是……我进行更改,然后我想在本地Karaf实例上测试它。这可能会发生几次每小时。

我现在这样做的方法是通过maven构建创建一个JAR捆绑包,然后将其复制到Karaf的部署目录中。我认为这一点都不优雅。

我试图找到一个解决方法(谷歌)。我了解了Karaf的特性,但似乎尽管它是一个很好的部署整个应用程序的机制,但它并不能解决我的问题。如果我理解正确,它没有检查本地Maven存储库中是否出现了我的SNAPSHOT JAR的新版本,对吗?


为什么不直接从你的IDE中运行OSGi框架呢? - Neil Bartlett
你建议每次应用程序运行时启动Karaf/OSGI框架吗?还是使用IDE在Karaf上进行捆绑部署? - Michal Chudy
我建议每次需要运行bundle时,在OSGi框架中运行它。Karaf是一个应用服务器,我不想将其部署到开发环境中。 - Neil Bartlett
2
在karaf中采用这种方法的困难之处在于,需要在纯OSGi框架中重新创建一个类似于karaf的环境,以便能够发挥其作用。很多时候,这项工作量太大而不可行。(例如,当您在bundle中使用jpa时,需要部署大量的karaf才能使其正常工作) - Christian Schneider
1
此外,应用程序由许多不同的捆绑包组成,它们相互交互。我想测试当其中一个需要即时升级时应用程序的行为如何。这非常重要,以测试所有服务及其依赖项在应用程序某些部分升级时是否正常运行。 - Michal Chudy
1个回答

32

使Karaf的更新机制正常工作的关键在于使用Maven进行部署,而不是使用部署文件夹。

像这样安装您的Bundle:

install -s mvn:groupid/artifactID/version
或者
install -s mvn:groupid/artifactID/version/typeOfMavenArtifact

第二个对于安装war/wab工件非常有用。完整的Maven协议规范可以在这里找到。

然后Karaf就会知道bundle来自哪里。您还可以使用la -u检查此内容。这使得karaf显示更新位置,现在应该是一个maven uri。您将看到所有karaf bundles都具有此类更新位置。

当您使用maven创建项目的新构建时,它将最终出现在本地maven存储库中。 然后只需运行

update <bundleid>

这将使karaf检查更新位置(在您的情况下是本地maven存储库),并从那里重新加载bundle。

您甚至可以使用更进一步的自动化来实现此操作。

dev:watch

或者适用于Karaf 3+

bundle:watch

这将使karaf检查您的maven存储库中已部署的SNAPSHOT bundle的更改,并自动重新部署这些bundle。

这与远程调试非常配合。使用

export KARAF_DEBUG=true

在开始karaf之前,它将会监听5005端口上的调试器。

然后您可以在同一端口上启动远程调试eclipse会话,并在karaf中轻松调试应用程序。即使使用上述方法之一更改了捆绑包,这也非常有效。因此,您可以调试、查找问题、更改代码、构建并继续使用已更改版本进行调试。

当我在karaf代码库本身工作时,我经常使用此功能,因为这对于大多数karaf自己的捆绑包也适用。


这在我们的Karaf 4.0.4中似乎无法工作。update <bundleid>命令仅能从我们的远程Maven存储库(Nexus)更新一次捆绑包。之后,即使我们指定了@snapshotUpdate=always,未来的更新命令也不起作用。如果我们重新启动Karaf,则下一个更新将起作用(仅限一次)。 - Michael Lucas
这仅适用于本地存储库。您在本地编译快照,它将自动更新。您在远程存储库中的使用情况是什么? - Christian Schneider
我们有 DEV 服务器,想要部署快照制品。首先,我们使用 CI 服务器(Bamboo)构建它们,然后将它们放入 Nexus 远程仓库中。然后,我们想使用 karaf shell 的 bundle:update 命令进行部署(或者有时使用 karaf web 控制台中的“更新”按钮)。这适用于发布制品,但对于快照制品存在我所描述的问题。 - Michael Lucas
3
好的,我们找到了解决快照无法从远程仓库下载的问题的方法。我们需要添加一个系统属性 aether.updateCheckManager.sessionState=false。这样它就会每次都检查远程仓库,而不是每次会话只检查一次。 - Michael Lucas
2
我们尽了各种努力,从日志中发现问题与aether组件有关,它宣称因为“已在此会话中更新”等原因不会从远程存储库更新。我的同事深入源代码后发现可以控制基于会话的检查的系统属性。 - Michael Lucas

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