当前位置: 首页 > 知识库问答 >
问题:

使用Gradle OSGI插件扫描Blueprint XML文件

陶福
2023-03-14

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

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

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

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

<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生成包含导入包的MANIFEST. MF

apply plugin: 'osgi'

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

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

我在Gradle 2.4和现在最新的2.10中测试过这个

共有1个答案

陈弘厚
2023-03-14

maven bundle插件的蓝图解析功能由maven bundle插件的BlueprintPlugin类提供,而不是BND。BND确实包含一些支持蓝图的代码,但这是repoindex命令工具的一部分。

通过手动解析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(',')
    }
}
 类似资料:
  • 我应该在属性文件中添加什么以便它包括。模块文件?

  • 我正在使用sonar maven插件触发java代码分析。 声纳转轮卡住了一个java文件处理。控制台上的最后一条消息读取JavaAST扫描和进程卡在... SonarQube版本:7.3.0 Sonar maven插件版本:3.6。0.1398(最新版本),但已尝试使用3.4。1.1168也是如此 日志如下所示: OOM异常堆栈跟踪: 几个小时后,它会抛出内存不足异常 顺便说一下,这个代表了po

  • 问题内容: 我正在玩Scanner类,以进行学习,并且我使用它来读取非常大的文件(大约60.000行,大约不使用Reader类),并且在大约400行后停止读取。我是否必须在Scanner的构造函数中使用Bufferedreader还是问题?我想知道为什么会这样。谢谢。我的代码是输出所有行的常用代码。 问题答案: 此问题通常在64位计算机上或文件大小大于1-2 GB的文件中更常见,并且与堆空间无关。

  • 我很难将这样的东西解析成数组。 所以我的文本文件test.txt有这样一行:(1231212A,1231212B)(1231212C,321128D) 我试图把它扫描成一个数组,但它需要分成几个部分 int类型的part1应为:123 第二部分:12 第3部分:12 第四部分(字符):A 我需要在这条线上做4次 这是我的代码,但它不能正常工作 当我打印这些数组时,它们不会打印正确的数字和字符。我需

  • 我正在尝试将文件的内容放入数组中。文件内容是正整数和负整数。 这就是我所做的,以确定我应该使数组多大。inFile是我的扫描仪。我能够打印inFile的内容,但它们不会进入数组。我只得到空值。 这就是我试图将文件内容放入数组所做的。 谢谢你的帮助。

  • 我需要在一种方法中将文件名作为扫描仪的输入,并在所有其他方法中将该扫描仪用作其余代码的文件路径的引用。 我正在学习文件I/o,对于这个项目,我应该以文件名作为输入,计算文件中的行数,并将每行放入一个数组中。 我的问题出现在FileUtils期间。countRecords方法。在FileUtils中返回文件类型后。打开输入文件(openInputFile),然后将数据放入扫描仪(代码中的变量inf和