我在Eclipse中使用bndtools处理OSGi包。我刚刚向cnf/localrepo
存储库添加了一个新的bundle(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中添加一个在构建之前刷新索引的任务?
我们是否应该将所有依赖项移动到在线存储库中,以便不需要管理索引?
答案 0 :(得分:2)
什么样的回购是cnf/localrepo
?如果它是FileRepo
,那么您不需要索引。您只需将bundle的文件夹/文件名格式设置为bundle的bsn / version。如果is是indexed repo,则必须维护索引并使用添加到repo的新bundle提交它。这是我们管理bundle-hub repo。每当添加新包时,我们都会更新索引。
对于gradle插件,您可以编写一个任务来重新索引每个构建的repo。有关如何执行此操作的讨论,请参阅https://groups.google.com/forum/#!searchin/bndtools-users/index$20gradle/bndtools-users/OQ0Ns5v0ELo/JOB803lBBwAJ。
答案 1 :(得分:0)
我们是否应该将所有依赖项移动到在线存储库中,以便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脚本的方向。