Java 使用Gradle OSGI插件扫描蓝图XML文件
我正在研究将现有的OSGI/blueprint项目从Maven迁移到Gradle。在Maven中,Maven bundle插件会扫描上下文XML文件,以查找代码中可能没有的导入,但是我无法将其与Gradle OSGI插件一起使用 例如,BlueprintXML包含这样的导入Java 使用Gradle OSGI插件扫描蓝图XML文件,java,gradle,blueprint-osgi,Java,Gradle,Blueprint Osgi,我正在研究将现有的OSGI/blueprint项目从Maven迁移到Gradle。在Maven中,Maven bundle插件会扫描上下文XML文件,以查找代码中可能没有的导入,但是我无法将其与Gradle OSGI插件一起使用 例如,BlueprintXML包含这样的导入 <reference id="exampleService" availability="mandatory" interface="com.adamish.test.Test" /> Import-Packa
<reference id="exampleService" availability="mandatory" interface="com.adamish.test.Test" />
Import-Package: com.adamish.test
然后生成的MANFEST.MF将包含如下导入
<reference id="exampleService" availability="mandatory" interface="com.adamish.test.Test" />
Import-Package: com.adamish.test
格拉德尔
但是,使用以下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调用时,它不会导致将导入添加到清单中
我已经在Gradle2.4和最新的2.10中对此进行了测试,maven bundle插件的蓝图解析功能是由maven bundle插件的类部分提供的,而不是BND。BND确实包含一些支持蓝图的代码,但这是 通过手动解析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(',')
}
}
def importPackages=new LinkedHashSet();
文件树(目录:“src/main/resources/OSGI-INF/blueprint/”,包括:“*.xml”)。每个{
新建XmlSlurper().parse(it)。'**'.findAll{it.@availability==“mandatory”}。每个{
def iFace=it@interface.text()
importPackages.add(iFace.substring(0,iFace.lastIndexOf('.'))
}
}
importPackages.add('com.adamish.foo')
罐子{
显示{
说明“导入包”,导入包。连接(','))
}
}
如果我是你,我会使用LinkedHashSet,这样,importPackages.join(',')
不是修改jar步骤,而是选择在源代码bnd.bnd
中明确提到包:导入包:${project.ext.blueprintInterfaces}
和返回importBlueprintPackages.join(','))
从您的函数中。然后,我必须添加一个任务loadBlueprintClasses{project.ext.blueprintInterfaces=processBlueprintInterfaces()}
Nice one!