【问题标题】:bnd gradle plugin fails after adding bundles to a repository将捆绑包添加到存储库后,bnd gradle 插件失败
【发布时间】:2016-02-10 02:05:45
【问题描述】:

我正在使用 Eclipse 中的 bndtools 开发 OSGi 包。我刚刚向cnf/localrepo 存储库添加了一个新包(apache commons logging),而我们的 CI 服务器现在无法构建:

[Gradle] - Launching build.
[workspace] $ gradle build
:mybundle  : Cannot find /error/com.springsource.org.apache.commons.logging;version=0 Not found in [bnd-cache, Release, Local, Bndtools Hub, /var/lib/jenkins/jobs/myapp/workspace/cnf/nonosgi-repo r/w=true]
Error  : com.springsource.org.apache.commons.logging;version=0 Not found in [bnd-cache, Release, Local, Bndtools Hub, /var/lib/jenkins/jobs/myapp/workspace/cnf/nonosgi-repo r/w=true]

为简单起见,对项目名称进行了轻微混淆。

在我看来,gradle 插件没有刷新存储库索引 - 如果我的一个队友从我们的 vcs 更新而没有在 Eclipse 中刷新,那么他们会得到同样的错误。

我知道 bndtools 有 org.osgi.impl.bundle.repoindex.cli 插件,但我对 bndtools 或 gradle 的了解还不够,无法将其应用到我的项目中。我也觉得要么 (a) gradle 插件应该自行刷新存储库,要么 (b) 我错误地使用了存储库。

是否可以在 build.gradle 中添加一个在构建之前刷新索引的任务?
我们是否应该将所有依赖项移至在线存储库,以便 bnd 不需要管理索引?

【问题讨论】:

    标签: java osgi bnd


    【解决方案1】:

    cnf/localrepo 是什么类型的 repo?如果是FileRepo,则不需要索引。您只需将捆绑包放在捆绑包的 bsn/版本的文件夹/文件名格式中。如果 is 是 indexed repo,那么您必须维护索引并使用添加到 repo 的新包提交它。这是我们管理的bundle-hub repo。每当添加新包时,我们都会更新索引。

    至于 gradle 插件,你可以编写一个任务来重新索引你的 repo 每个构建。有关如何执行此操作的讨论,请参阅 https://groups.google.com/forum/#!searchin/bndtools-users/index$20gradle/bndtools-users/OQ0Ns5v0ELo/JOB803lBBwAJ。

    【讨论】:

    • 这是一个 LocalIndexedRepo。我们曾经提交过索引,但是我们发现 标签中的“increment”属性在每次有人从 vcs 中拉取时都会导致合并冲突。 FileRepo 对我们没有用,因为我们需要从存储库中解析运行时依赖项。
    • 我看到了关于 bndtools-users 的讨论,但是 Eli 的 github repo 已经不存在了,我看不到他的 IndexRepository 任务类型的来源。但是,我现在看到 Bndtools-Hub 有一个任务 (github.com/bndtools/bundle-hub/blob/master/build.gradle) 为其存储库建立索引。这和 FixedIndexedRepo 可能会对我有所帮助。
    • Eli 遇到的问题是在同一个 gradle 步骤中运行重新索引任务和构建。如果您作为单独的 gradle 调用运行,那就没问题了。如果你想在同一个 gradle 调用中运行,那么你需要在组线程中讨论的重新索引步骤之后处理清除错误。
    【解决方案2】:

    我们是否应该将所有依赖项移至在线存储库,以便 bnd 不需要管理索引?

    可能,但由于各种原因,在短期内继续使用我们的LocalIndexedRepository 会更容易。

    是否可以在我们的 build.gradle 中添加一个在构建之前刷新索引的任务?

    bndtools 的 Bundle-Hub 存储库使用 org.osgi.impl.bundle.repoindex.cli 插件在其 build.gradle 中重新索引存储库。由于我对 groovy 或 gradle 不熟练,所以我只是将其代码复制到 cnf/localrepo/build.gradle:

    repositories {
      mavenCentral()
    }
    
    configurations {
      repoindex
    }
    
    dependencies {
      repoindex group: 'biz.aQute.bnd', name: 'org.osgi.impl.bundle.repoindex.cli', version: '3.0.0' 
    }
    
    defaultTasks = [':index']
    
    task('index') {
      /* Bundles to index. */
      def bundles = fileTree(projectDir) {
        include '**/*.jar'
        exclude '**/*-latest.jar'
        exclude '.*/'
      }
      doLast {
        javaexec {
          main = '-jar' // first arg must be the jar
          args configurations.repoindex.singleFile
          args '-n', 'Local' // REPO NAME HERE
          args bundles*.absolutePath
        }.assertNormalExitValue()
      }
    }
    

    感谢 BJ Hargrave 为我指明了 Bundle-Hub 脚本的方向。

    【讨论】:

      猜你喜欢
      • 2015-06-05
      • 2019-12-14
      • 2013-01-03
      • 2016-01-13
      • 2010-11-19
      • 1970-01-01
      • 2020-08-15
      • 2022-07-01
      • 1970-01-01
      相关资源
      最近更新 更多