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

标签 java gradle osgi bnd bndtools

我有一个看起来像这样的 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 任务运行良好 - 显然没有语法或 Unresolved 导入问题
  • 我使用 clean --refresh-dependencies 运行 gradle,但没有任何效果
  • 我清除了 ~/.gradle/caches 目录(Windows 主路径),但没有效果
  • 这是一个“在我的机器上不起作用”的问题:它在其他机器上以“完全相同”的设置(相同的源、相同版本的引用、相同的 java 和 gradle 版本)运行。

更多详情: - 我正在使用 Java 1.8.151(32 位)

最佳答案

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

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

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

关于java - OSGi:BND 工具无法仅 @Reference 特定组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60952246/

相关文章:

android - 在 flutter 项目中为 android 模块使用自定义名称

java - 为什么基于OSGi模型的Eclipse安装新插件后需要重启?

java - SWIG 类型映射 uint8_t* 从 C/C++ 到 java.nio.ByteBuffer

java - 如何在 build.gradle 中选择版本

java - 如何保持缓存与数据库同步?

java - 如何在带有 Gradle 的 Java 项目中使用 DexGuard

java - OSGi Felix 依赖管理器注解和抽象类

Java - java.lang.NullPointerException

java - 如何使 Javafx 标签可选择

java - jUnit:如何过滤在多个套件中找到的测试