如何为运行时依赖项添加Import-Package指令?

Emi*_*erg 6 osgi gradle bnd

我正在使用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'
    }
}
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,Gradle会检测我的依赖项并添加一个Import-Package包含所有编译时依赖项的函数.但是说我的应用程序也有运行时依赖性org.springframework.orm,我如何告诉Gradle将其作为参数包含在内Import-Package

如果上面的注释行未注释,则生成的Import-Package指令 指定org.springframework.orm.这让我困惑,因为在摇篮文档OsgiManifest状态

OsgiManifest instruction(String name, String... values)

为指令添加参数.如果指令不存在,则创建它.如果它存在,则参数将附加到现有参数.

但是,这似乎不适用于自动检测到的Import-Package参数.如果我指定instruction 'Import-Package', 'my.dependency.1'等等,并jar.manifest.instructions在其间打印,我可以看到它们是如何按顺序添加的,它们都出现在生成的清单中,但似乎Gradle的OSGi插件如果Import-Package手动指定则不会添加自动检测到的参数.

TL; DR:

  • 如果我不手动指定Import-Package指令,它将自动生成所有编译时依赖项,但不是运行时依赖项.
  • 如果我这样做manifest { instruction 'Import-Package', 'org.springframework.orm' },那么编译时依赖关系不会自动包含在内.

如何告诉Gradle我的运行时依赖项,以便将它们添加到Import-Package

Nei*_*ett 6

我不熟悉Gradle bnd插件,但我熟悉bnd.

Import-Packagebnd指令的默认值是*.方法:匹配所有生成的导入.如果为其指定单个值,Import-Package则它将覆盖*并成为唯一的导入.因此,你的Import-Package指令几乎总是*以最后一个位置的全能结束.

猜测这将如何转换为Groovy/Gradle,我建议如下:

instruction 'Import-Package', 'org.springframework.orm', '*'