Феликс перечисляет пакет OSGI как активный, но команда Gogo Shell недоступна (связана с зависимостью)

Этот базовый код успешно делает команду scopeA:test доступной в оболочке:

package com.A;

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.apache.felix.service.command.Descriptor;

@Component(immediate = true)
@Instantiate
@Provides(specifications = Commands.class)
public final class Commands {

    @ServiceProperty(name = "osgi.command.scope", value = "scopeA")
    String scope;

    @ServiceProperty(name = "osgi.command.function", value = "{}")
    String[] function = new String[] {
            "test"
    };

    @Descriptor("Example")
    public void test() {
        System.out.println("hello");
    }
}

Однако, если я добавлю конструктор, который зависит от другого компонента OSGI, эта команда больше не будет доступна, и «помощь» не укажет ее. Тем не менее, пакет все еще может загружаться в активное состояние.

package com.A;

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.ServiceProperty;
import org.apache.felix.service.command.Descriptor;

import com.B;

@Component(immediate = true)
@Instantiate
@Provides(specifications = Commands.class)
public final class Commands {

    public Commands(@Requires B b) {
    }

    @ServiceProperty(name = "osgi.command.scope", value = "scopeA")
    String scope;

    @ServiceProperty(name = "osgi.command.function", value = "{}")
    String[] function = new String[] {
            "test"
    };

    @Descriptor("Example")
    public void test() {
        System.out.println("hello");
    }
}

Содержимое B просто:

import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Instantiate;
import org.apache.felix.ipojo.annotations.Provides;

@Component(immediate = true)
@Instantiate
@Provides
final class B {
}

Любые идеи, почему команда больше не указана? Советы по поиску дополнительной информации о состоянии, чтобы я мог лучше отладить это?


person user1991839    schedule 07.02.2013    source источник
comment
Действительно ли служба B опубликована? Вы можете проверить с помощью команды inspect cap service [id], где [id] должен быть идентификатором бандла, содержащего компонент B.   -  person Neil Bartlett    schedule 08.02.2013


Ответы (2)


Проблема в том, что командам нужно, чтобы @Requires находился в поле, а не в конструкторе.

@Requires
B b;

Конструктор также должен быть удален.

Это связано с тем, что у gogo есть специальный метод вызова компонента.

person user1991839    schedule 08.02.2013

также для меня это нужно изменить

@ServiceProperty(name = "osgi.command.function", value = "{}")
String[] function = new String[] {
    "test"
};

to

@ServiceProperty(name = "osgi.command.function", value = "{test}")
String[] function;
person aminator    schedule 03.02.2020