bnd gradle 插件在将包添加到存储库后失败

bnd gradle plugin fails after adding bundles to a repository

我正在 Eclipse 中使用 bndtools 开发 OSGi 包。我刚刚向 cnf/localrepo 存储库添加了一个新包(apache 公共日志记录),我们的 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 不需要管理索引?

cnf/localrepo 是哪种回购协议?如果是FileRepo, then you don't need an index. You just put the bundles in a folder/filename format for the bundle's bsn/version. If is is an indexed repo, then you must maintain the index and commit it with the new bundles added to the repo. This is we manage the bundle-hub repo。每当添加新包时,我们都会更新索引。

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

Should we instead move all our dependencies to an online repository so bnd doesn't need to manage the indexes?

可能,但由于各种原因,短期内继续使用我们的 LocalIndexedRepository.

会更容易

Is it possible to add a task to our build.gradle that refreshes the indexes before a build?

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 脚本的方向。