如何避免Gradle的osgi插件为私有包生成export-pacakge条目,为嵌入式依赖项生​​成import-package条目

时间:2017-02-11 23:38:46

标签: java gradle osgi bnd

亲爱的StackOverflow用户

我有一个gradle项目,我希望将该工件转换为osgi包。在这个包中我有:

  • 我不想导出的包(可能不会出现在清单的Export-Package条目中)
  • 我要嵌入的依赖项(可能不会出现在清单的Import-Package条目中)

经过一些修修补补后,我提出了以下gradle.build文件,该文件符合我的意图,但可能不是最干净的方式,利用bnd ...

group 'com.mycompany'
version '1.0.0'

apply plugin: 'java'
apply plugin: 'osgi'

repositories {
    jcenter()
}

dependencies{
    compile 'org.osgi:org.osgi.framework:1.8.0'  //provided
    compile 'com.google.code.gson:gson:2.8.0'    //embedded
}


jar {
    //embedding the gson dependency
    from({
        def x = configurations.compile.find({
            return it.getName().contains('gson')
        })
        def tree = zipTree(x)
        return tree
    })

    //explicitly building manifest entries
    manifest {
        instruction 'Bundle-Vendor',
                'My Company'
        instruction 'Bundle-Activator',
                'com.mycompany.mybundle.Activator'
        instruction 'Import-Package',
                '!com.google.gson',           
                '*'
        instruction 'Export-Package',
                /com.mycompany.mybundle;version="${version}"/
    }
}

是否有可能以更清洁的方式实现这一目标?我主要想避免两件事:

  1. 必须手动编写导入和导出包条目
  2. 必须手动将嵌入式依赖项(gson)的内容复制到我的jar
  3. 我认为bnd(osgi插件的底层)可以为我做这件事,但是到目前为止我已尝试过(即使我将它们添加为私有包)bnd仍然导出所有内容并导入gson包以及它赢了不要将gson类添加到jar

1 个答案:

答案 0 :(得分:4)

最好使用Bnd Gradle plugin作为OSGi。它由知道OSGi的一两件事的开发人员编写和支持。