我正在使用Gradle构建一个OSGi jar,但我在清单方面遇到了一些问题。以下是我的构建脚本摘录:
apply plugin: 'java'
apply plugin: 'osgi'
jar {
baseName = 'awesome'
manifest {
name = 'An Awesome Application'
symbolicName = 'com.example.awesome'
// instruction 'Import-Package', 'org.springframework.orm'
}
}
使用上面的内容,Gradle检测我的依赖项,并添加一个具有所有编译时依赖项的Import-Package
。但是,假设我的应用程序在运行时也依赖于org.springframework.orm
,我如何告诉Gradle将其作为参数包含在Import-Package
中?
在上面注释行未注释的情况下,生成的Import-Package
指令仅指定org.springframework.orm
。这让我很困惑,因为OsgiManifest的Gradle文档中说明了
OsgiManifest instruction(String name, String... values)
将参数添加到指令中。如果指令不存在,它被创建。如果它确实存在,则参数将附加到现有的论点。
然而,这似乎不适用于自动检测到的Import-Package
参数。如果我指定instruction 'Import-Package', 'my.dependency.1'
等,并在其间打印jar.manifest.instructions
,我可以看到它们是如何按顺序添加的,并且它们都出现在生成的清单中,但如果手动指定Import-Package
,Gradle的OSGi插件似乎不会添加自动检测的参数。
TL;博士:
- 如果我不手动指定
Import-Package
指令,它将自动生成,包含我的所有编译时依赖项,但不包含运行时依赖项 - 如果我执行
manifest { instruction 'Import-Package', 'org.springframework.orm' }
,那么编译时依赖项不会自动包含在内
如何告诉Gradle我的运行时依赖项,以便将它们添加到Import-Package
?
我不熟悉Gradle bnd插件,但我熟悉bnd。
bnd指令中Import-Package
的默认值为*
。方法:与所有生成的导入匹配。如果为Import-Package
指定一个值,则它将覆盖*
并成为唯一导入。因此,您的Import-Package
指令几乎总是以最后一个位置的catch-all *
结束。
猜测一下这将如何转化为Groovy/Gradle,我建议如下:
instruction 'Import-Package', 'org.springframework.orm', '*'