从一个源安装多个软件包

时间:2010-08-12 23:19:16

标签: java osgi apache-karaf

我正在使用Apache Karaf作为OSGi容器。 Karaf有url包装器,可以直接从maven存储库安装包

> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT
Bundle ID: 139

一切正常。但我想从给定的来源开始几个捆绑。如果新捆绑偶尔会破坏生产服务并且我想要回滚,这是有道理的。使用OSGi,这非常简单

 > list 
 [ 139] [Active     ] [            ] [Started] [   60] Billing background service (2.2-20100811-1232)
 [ 140] [Resolved   ] [            ] [       ] [   60] Billing background service (2.2-20100809-1127)
 > update 140
 > list
 [ 139] [Active     ] [            ] [Started] [   60] Billing background service (2.2-20100811-1232)
 [ 140] [Resolved   ] [            ] [       ] [   60] Billing background service (2.2-20100812-1354)
 > start 140
 > stop 139
 > list
 [ 139] [Resolved   ] [            ] [       ] [   60] Billing background service (2.2-20100811-1232)
 [ 140] [Active     ] [            ] [Started] [   60] Billing background service (2.2-20100812-1354)
 #################
 # suppose we need to rollback here
 #################
 > start 139
 > stop 140

问题是我无法从一个来源创建多个捆绑包:

> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT
Bundle ID: 139
> install mvn:com.farpost.billing/background-service/2.2-SNAPSHOT
Bundle ID: 139

第二次install调用不执行任何操作,但返回已存在的包ID。所以我的问题是,有没有办法从一个源URL创建几个包?

3 个答案:

答案 0 :(得分:2)

您遇到的问题是,您无法安装具有相同符号名称和版本的捆绑包的多个副本。

即使你可以,也有在你描述的场景中安装了同一个捆绑包的两个不同版本的副作用,因为只要安装了捆绑包,它就可以用来解析包。在您的场景中,这可能不是您想要的,因为您想要使用一个或另一个捆绑,而不是混合。

最后,我建议你只安装你想要的捆绑包。如果存在问题,请通过卸载有故障的软件包并安装旧版本来回滚。如果您想自动安装和更新(套件)软件包,请查看Apache ACE,这是一个OSGi的软件供应框架,可帮助您自动化这些方案(并管理OSGi系统)。

答案 1 :(得分:2)

可以使用功能文件一次安装多个捆绑包。目前,我们有一个功能文件,定义了大约6-7个包。最重要的是,该文件包含一个需要另一个6-7的功能。通过安装“主”功能,Karaf可以同时安装以下所有捆绑包。如果你愿意,你可以让Karaf在启动时运行这些捆绑包。

为了做到这一点:

  1. 创建功能文件。更多信息可以在这里找到:external source

  2. 将该功能文件放在m2目录中的某个位置。

  3. 修改Karaf主目录中的org.apache.karaf.features.cfg。将mvn URL添加到刚刚创建的features文件到“featuresRepositories”标记。 (可选)如果要在启动时加载功能,请将功能名称添加到“featuresBoot”。

  4. 启动Karaf后,您可以输入“features:install name_of_feature”。这将启动功能以及功能文件定义的功能所需的任何其他内容。

  5. 然后,您可以键入list以验证所有必需的包正在运行。如果任何捆绑包发生更改或添加了新捆绑包,则存在需要更新的缺点。

    希望这有帮助。

答案 2 :(得分:1)

编辑:刚看到这篇文章已经有一年了! Stackoverflow RSS feed把它放在我的列表顶部!?!

+ 1到Marcel&托尼,两个都是正确的。

RESOLVED状态的捆绑包是活动导出/导入包(ACTIVE表示已启动并完成任何服务激活),您应该使用Karaf功能。 目前我们手动滚动我们的karaf-features文件(参见分发下载中的PDF文档),因为v2.x插件为每个依赖项创建了一个单独的功能,并且有点古怪(我没有尝试过trunk / v3但是它似乎是fixed

你正在尝试的有两个陷阱;

  1. pax maven url handler命令将识别该软件包已安装且无法执行任何操作
  2. 即使它确实如此,第二个捆绑包也会失败,因为很可能符号名称与第一个相同
  3. (最差)选项1:

    如果您真的非常渴望专门解决这个问题,假设您使用maven-bundle-plugin,请将buildnumber-maven-plugin添加到bundle config:

    <Bundle-SymbolicName>${project.artifactId} ${buildNumber}</Bundle-SymbolicName>
    

    然后,当您安装捆绑包时,请使用显式快照版本(版本名称中的SNAPSHOT在概念上只是指向最新时间戳版本的存储库软链接):

    install mvn:com.farpost.billing/background-service/2.2-20100812-1354
    

    使用此选项,正如Marcel所说,您可以在从RESOLVED包中导入服务时将其他捆绑包导入连接到ACTIVE捆绑包 - 因此类错配会破坏您的系统。

    (较差)选项2:

    略好一点(并且没有更改pom.xml):

    1. 请注意捆绑包的确切时间戳版本
    2. 调用refresh命令
    3. 要回滚,请卸载该捆绑包并安装之前提到的版本
    4. 有了这个选项,就像托尼所说的那样,你是单独管理所有这些捆绑包,这是一个痛苦和危险的东西(什么适用于什么?这写下来的地方?)。 Karaf功能和versions-maven-plugin插件将是一个更好的解决方案

      (好)选项3:

      1. 将你的捆绑分成两部分;一个API包和实现包 - 这种方式切换你的实现包(服务和实际逻辑)不会影响包的连接只是服务分辨率
      2. 使用OSGi版本控制方案,它与maven版本控制具有合理的协同作用(请参阅semantic versioning pdf上的negative qualifiers和Peter Kriens帖子)。该方案是MAJOR.MINOR.MICO.qualifier,其中除了错误修复之外不添加任何新功能的微数字
      3. SNAPSHOTs应仅用于开发而非生产,因为您正在使用未经测试的,可更改的移动目标(您必须使用快照将其锁定为您实际使用过的版本)使用带时间戳的版本(对于第三方依赖项,您必须使用SNAPSHOT版本,versions-maven-plugin lock-snapshots目标可以在此处提供帮助)
      4. 使用Karaf功能,它使大型捆绑包更容易管理(使用一个命令部署整个堆栈并进行类似升级)
相关问题