如何使用 sbtosgi 生成 osgi 包作为 sbt 发布任务的一部分

Posted

技术标签:

【中文标题】如何使用 sbtosgi 生成 osgi 包作为 sbt 发布任务的一部分【英文标题】:How to use sbtosgi to generate osgi bundle as part of sbt publish task 【发布时间】:2012-04-29 23:01:07 【问题描述】:

我正在使用sbtosgi plugin 从使用 bnd 的 sbt 构建生成 OSGi 包。 sbtosgi 包提供了 osgi-bundle 任务来生成包。使用 sbtosgi 的默认配置,从 sbt 提示符运行 osgi-bundle 会更新 JAR 以包含正确的标头,但运行 clean package 会导致 JAR 没有 OSGi 标头。在 Maven 中,我正在尝试将 maven-bundle-plugin 与 Packaging = bundle 一起使用——也就是说,项目的主要工件应该是一个 OSGi 包。

根据阅读 sbtosgi 插件的源代码,在我看来,osgi-bundle 任务覆盖了 packageBin 创建的 JAR。我尝试覆盖 packageBin 的定义,以便它使用 osgi-bundle 任务而不是默认任务:

  packageBin in Compile <<= OsgiKeys.bundle

这导致了循环引用:

[error] Cyclic reference involving 
[error]    file:project/*:osgi-bundle
[error]    file:project/compile:full-classpath
[error]    file:project/compile:exported-products
[error]    file:project/compile:package-bin

我对 SBT 比较陌生,我不知道从哪里开始。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

看起来我最初通过 Twitter 提出的您使用的建议不起作用。对此感到抱歉。但幸运的是,我让 Mark Harrah 坐在我旁边,这是一个可行的解决方案:

packagedArtifact in (Compile, packageBin) <<= (artifact in (Compile, packageBin), OsgiKeys.bundle).identityMap

artifact in (Compile, packageBin) ~= (_.copy(`type` = "bundle"))

【讨论】:

以上是关于如何使用 sbtosgi 生成 osgi 包作为 sbt 发布任务的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 maven 项目轻松部署到 Karaf Osgi 容器

如何使用 Maven 将第 3 方 OSGi 捆绑包添加到部署包中?

OSGi 用户管理服务用户对象

如何使用 bndtools 通过 Scala 创建 OSGi 包?

OSGi 包更新如何工作?

OSGI容器中的Scala?