如何为运行时依赖项添加导入包说明



我正在使用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', '*'

最新更新