OSGi: инструменты BND не могут @Reference только для определенного компонента

У меня есть компонент OSGi, который выглядит так

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

Аннотация @Reference больше нигде в источнике не встречается.

Я использую gradle 5.6 с инструментами BND для создания банки:

// 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
     }

  • Я не получаю сообщение об ошибке, когда удаляю 3-ю указанную службу (имеются только первые две)
  • Я получаю сообщение об ошибке, когда я ссылаюсь на третий компонент, например. по первому или второму варианту.
  • Задачи compileJava работают хорошо - по-видимому, нет синтаксиса или нерешенной проблемы с импортом
  • Я запустил Gradle с clean --refresh-dependencies, ничего не получилось
  • Я очистил каталог ~/.gradle/caches (домашний путь Windows) безрезультатно.
  • Это проблема «не работает на моей машине»: она работает с «точно» той же настройкой (тот же источник, та же версия ссылок, та же версия java и gradle) на других машинах.

Дополнительные сведения: - Я использую Java 1.8.151 (32-разрядная версия).


person Moritz    schedule 31.03.2020    source источник


Ответы (1)


Вы не указываете версию плагина biz.aQute.bnd.builder. Последний выпуск — 5.0.1, который определенно поддерживает аннотации OSGi DS 1.4, поддерживающие внедрение конструктора.

Вы также не указываете, какую версию аннотаций OSGi DS вы используете. Вы должны использовать версию 1.4, чтобы использовать внедрение конструктора.

Что касается того, почему он не работает только на вашей машине, я не могу сказать :-(

person BJ Hargrave    schedule 31.03.2020
comment
Я использую bnd.builder 4.1.0. Аннотации OSGi взяты из org.osgi.cmpn версии 7.0.0. Однако проблема в том, что инъекция CTOR действительно работает, есть только эта проблема с этим очень конкретным компонентом, на который ссылаются (возникающим на этапе сборки jar). - person Moritz; 01.04.2020
comment
Если вы можете создать небольшой репозиторий на github, который демонстрирует проблему, откройте проблему в репозитории bndtools/bnd на github, и мы сможем провести расследование. - person BJ Hargrave; 03.04.2020
comment
Bnd 4.1.0 — это первый выпуск поддержки Bnd для аннотаций OSGi DS 1.4. Возможно, есть какая-то ошибка, которая была исправлена ​​в более поздней версии Bnd. Поэтому, пожалуйста, попробуйте Bnd 5.0.1, которая является последней версией Bnd (на данный момент). - person BJ Hargrave; 03.04.2020
comment
Пробовал с Bnd 5.0.1, это не решило проблему. Мне жаль, что я не могу опубликовать код, так как он раскроет информацию о клиенте - я также не могу сделать минимальный пример, потому что только один конкретный класс (интерфейс) приводит к этой ошибке. Этот интерфейс никаким очевидным образом не отличается от других интерфейсов (все они включены в предварительно скомпилированные библиотеки, все предварительно скомпилированные библиотеки были скомпилированы с использованием одной и той же версии Java и уровня совместимости с Java (1.8) и т. д.). Однако я постараюсь убрать все, чтобы воспроизвести эту проблему на минимальном примере. - person Moritz; 03.04.2020