7

我正在使用 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,Gradle 的 OSGi 插件似乎不会添加自动检测的参数Import-Package.

TL;博士:

  • 如果我不手动指定Import-Package指令,它会自动生成我所有的编译时依赖项,而不是运行时依赖项。
  • 如果我这样做manifest { instruction 'Import-Package', 'org.springframework.orm' },则不会自动包含编译时依赖项。

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

4

1 回答 1

6

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

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

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

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

于 2013-06-25T15:01:43.270 回答