Felix将OSGI捆绑软件列为有效,但Gogo Shell命令不可访问(与依赖相关)

问题描述 投票:2回答: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 {
}

为什么不再列出该命令?查找有关该状态的更多信息的提示,以便我可以更好地进行调试?

osgi apache-felix ipojo
2个回答
1
投票

问题是命令需要将@Requires放在字段而不是构造函数中。

@Requires
B b;

也必须删除构造函数。

这是因为gogo有一种调用组件的特殊方法。


0
投票

对我来说,这也需要更改

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

to

@ServiceProperty(name = "osgi.command.function", value = "{test}")
String[] function;
© www.soinside.com 2019 - 2024. All rights reserved.