使用 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(',')
}
}
我正在研究将现有 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.MFapply 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(',')
}
}