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

Blueprint XML file scanning with Gradle OSGI plugin

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

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

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

行家

在带有 maven-bundle-plugin 的 POM 中使用 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 

Gradle

但是,使用以下 build.gradle 文件不会生成带有 com.adamish.test

导入包的 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

中测试过了

maven-bundle-plugin 的蓝图解析能力由 class BlueprintPlugin part of maven-bundle-plugin, not BND. BND does contain some blueprint-aware code, however that is part of a 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(',')
    }
}