2

この基本的なコードは、コマンド 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 {
}

コマンドがリストされなくなった理由はありますか? これをより適切にデバッグできるように、状態に関する詳細情報を見つけるためのヒントはありますか?

4

2 に答える 2

1

問題は、コマンドが @Requires をコンストラクタではなくフィールドに置く必要があることです。

@Requires
B b;

コンストラクターも削除する必要があります。

これは、gogo にはコンポーネントを呼び出す特別な方法があるためです。

于 2013-02-08T01:06:24.930 に答える