繁体   English   中英

OSGi:BND 工具仅无法@Reference 特定组件

[英]OSGi: BND tools fail to @Reference only a specifc component

我有一个看起来像这样的 OSGi 组件

    @Activate
    public MyComponent(@Reference OtherServiceA ref1, @Reference OtherServiceB ref2, @Reference OtherServiceC ref3) {
         // remainder omitted
     }

@Reference注释不会出现在源中的其他任何地方。

我使用 gradle 5.6 和 BND 工具来构建 jar:

// file: build.gradle
plugins {
    id 'biz.aQute.bnd.builder'
}

运行 jar 任务会导致以下错误:

> Task :my.pro.ject:jar FAILED
error  : In component my.pro.ject.mypackage.MyComponent, @Reference cannot be used for method parameters

FAILURE: Build failed with an exception.

和相应的堆栈跟踪

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':my.pro.ject:jar'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.accept(ExecuteActionsTaskExecuter.java:166)
[...]
Caused by: org.gradle.api.GradleException: Bundle my.pro.ject-2.0.0-SNAPSHOT.jar has errors
        at aQute.bnd.gradle.BundleTaskConvention.failBuild(BundleTaskConvention.groovy:310)
        at aQute.bnd.gradle.BundleTaskConvention$_buildBundle_closure6$_closure7.doCall(BundleTaskConvention.groovy:294)
        at aQute.bnd.gradle.BundleTaskConvention$_buildBundle_closure6.doCall(BundleTaskConvention.groovy:200)
        at org.gradle.util.ClosureBackedAction.execute(ClosureBackedAction.java:71)
[...]

我认为错误消息具有误导性:以下代码运行良好:

    @Activate
    public MyComponent(@Reference OtherServiceA ref1, @Reference OtherServiceB ref2) { // just removed ref3
         // remainder omitted
     }

  • 删除第三个引用的服务时没有出现错误(只有前两个)
  • 当我引用第三个组件时,例如在第一个或第二个选项中,我确实收到错误消息。
  • 任务 compileJava 运行良好 - 显然没有语法或未解决的导入问题
  • 我用clean --refresh-dependencies运行 gradle ,没有任何效果
  • 我清除了 ~/.gradle/caches 目录(Windows 主路径),没有效果
  • 这是一个“在我的机器上不起作用”的问题:它在其他机器上以“完全”相同的设置(相同的源、相同版本的引用、相同的 java 和 gradle 版本)运行。

更多详细信息: - 我使用的是 Java 1.8.151(32 位)

您没有指定biz.aQute.bnd.builder插件的版本。 最新版本是5.0.1 ,它肯定支持支持构造函数注入的 OSGi DS 1.4 注释。

您也没有提到您使用的是哪个版本的 OSGi DS 注释。 您必须使用 1.4 版才能使用构造函数注入。

至于为什么它只在你的机器上失败,我不能说:-(

我遇到了同样的问题,但是在使用非常古老的 Java 8 (1.8.0_60) 构建的项目中使用 bnd-maven-plugin (5.2.0) 时。 更新到(更多)最近的东西(bnd-maven-plugin 到 5.3.0 或 java 到 1.8.0_162)为我解决了这个问题。

我连接了调试器,并注意到在处理 @Deactivate 注释方法时产生了错误。 我没有进一步调查为什么来自构造函数的参数被评估为 deactivate 方法的一部分,以及为什么在更新 jdk 时这个问题消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM