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

时间:2013-06-25 13:10:20

标签: 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'
    }
}

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

如果上面的注释行未注释,则生成的Import-Package指令仅指定 org.springframework.orm。由于the Gradle documentation for 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

1 个答案:

答案 0 :(得分:6)

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

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

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

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