【问题标题】:How to add Import-Package instructions for runtime dependencies?如何为运行时依赖项添加 Import-Package 指令?
【发布时间】:2013-06-22 07:19:09
【问题描述】:

我正在使用 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插件没有添加auto-如果手动指定 Import-Package,则检测到参数。

TL;DR:

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

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

【问题讨论】:

    标签: osgi gradle bnd


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 看准了!正如文档中所预期的那样,instruction 'Import-Package', '*' 在它自己的行上也可以工作。
    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 2015-01-10
    • 2014-05-01
    • 1970-01-01
    • 2015-12-21
    • 2017-05-20
    相关资源
    最近更新 更多