使用Gradle OSGI插件扫描蓝图XML文件

时间:2016-01-04 12:43:15

标签: java gradle blueprint-osgi

我正在研究将现有的OSGI /蓝图项目从Maven迁移到Gradle。在Maven中,maven-bundle-plugin插件会扫描上下文XML文件以查找可能不会出现在代码中的导入,但是我无法使用Gradle OSGI插件。

例如,蓝图XML包含这样的导入

<reference id="exampleService" availability="mandatory" interface="com.adamish.test.Test" />

的Maven

使用maven-bundle-plugin中的Bundle-Blueprint指令...

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.4.0</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
        <Bundle-Blueprint>OSGI-INF/blueprint/context.xml</Bundle-Blueprint> 
        </instructions>
    </configuration>
</plugin>

然后生成的MANFEST.MF将包含这样的导入

Import-Package: com.adamish.test 

摇篮

但是,使用以下build.gradle文件不会生成带有com.adamish.test的Import-Package的MANIFEST.MF

apply plugin: 'osgi'

jar {
    manifest {
        instruction 'Bundle-Blueprint', 'OSGI-INF/blueprint/context.xml'
    }
}

分析

Maven和Gradle都使用BND,它似乎包含Bundle-Blueprint指令,但是当通过Gradle调用时,它不会导致将导入添加到MANIFEST。

我已经在Gradle 2.4和现在最新的2.10

中对此进行了测试

1 个答案:

答案 0 :(得分:1)

maven-bundle-plugin的Blueprint解析功能由maven-bundle-plugin的类BlueprintPlugin部分提供,而不是BND。 BND确实包含一些支持蓝图的代码,但这是repoindex command tool的一部分。

我已经能够通过手动解析XML文件并构建Java包列表来临时解决此问题

def importPackages = new LinkedHashSet<String>();
fileTree(dir: 'src/main/resources/OSGI-INF/blueprint/', include: '*.xml').each {
   new XmlSlurper().parse(it).'**'.findAll { it.@availability == "mandatory" }.each {
      def iFace = it.@interface.text()
      importPackages.add(iFace.substring(0, iFace.lastIndexOf('.')))
   }
}

importPackages.add('com.adamish.foo')

jar {
    manifest {
        instruction 'Import-Package', importPackages.join(',')
    }
}