2012-03-06 3 views
0

В настоящее время я пытаюсь реализовать пользовательскую команду оболочки для Felix с помощью iPOJO. Мой пример реализация выглядит следующим образом:Пользовательская команда Felix с аннотациями iPOJO

import java.io.PrintStream; 

import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Provides; 
import org.apache.felix.shell.Command; 

@Component(immediate = true) 
@Provides 
public class SampleCommand implements Command { 


    @Override 
    public String getName() { 
     return "testcmd"; 
    } 

    @Override 
    public String getUsage() { 
     return "testcmd"; 
    } 

    @Override 
    public String getShortDescription() { 
     return "test command"; 
    } 

    @Override 
    public void execute(String line, PrintStream out, PrintStream err) { 
     out.println("execute testcmd!"); 
    } 

} 

Когда я развернуть сверток на Феликсе, мой SampleCommand получает экземпляр и GetName() вызывается. Но когда я пытаюсь выполнить «testcmd» на корпусе, я получаю:

gogo: CommandNotFoundException: Command not found: testcmd 

Есть ли еще какие-то пункты, которые мне нужно учитывать?

ответ

7

На основе обратной связи, приведенной выше по user1231484 и earcam, здесь минимальный рабочий пример:

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.ServiceProperty; 
import org.apache.felix.service.command.Descriptor; 

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

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

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

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

} 
+0

+1, у вас должно быть достаточно очков, чтобы принять свой собственный ответ =) – earcam

4

Я не уверен, что вам нужно больше подклассов Command (this page выглядит очень старым), я думаю, он должен работать только зарегистрирует услугу с двумя специфическими свойствами:

  1. Сферы «osgi.command. Объем»свойство (который по существу представляет собой пространство имен, в случае, если ваши имена команд такие же, как те, которые предусмотрены другой.
  2. строка массива„osgi.command.function“с именами ваших методов, действующих в качестве команд

командам не нужно ничего знать о OSGi. Вы используете потоки печати обычным способом (они перенаправляются оболочкой)

E.g.

@ServiceProperty(name = "osgi.command.scope", value = "mycommands") 
@ServiceProperty(name = "osgi.command.function", value = {"execute", "add"}) 
@Component(immediate = true) 
@Provides 
public class SampleCommand implements MyOwnCommand { 

    @Override 
    public void execute(String line) { 
     System.out.println("execute testcmd! with line: " + line); 
    } 

    @Override 
    public void add(int a, int b) { 
     System.out.println(a + "+" + b + "=" + (a+b)); 
    } 

} 

Единственная цена, которую вы платите за это, - это потеря поддержки и использования.

+0

Спасибо за ваше предложение, к сожалению, я не могу установить аннотацию @property для классов (ошибка компилятора «запрещенную для этого место нахождения"). Есть ли что-то, что я мог бы неправильно понять? – qqilihq

+0

Извинения, исправлены теперь @ServiceProperty – earcam

+1

+1 Gogo Shell - это будущее! –

2

Вы разрабатываете команду для Felix Shell (старый). Однако, поскольку довольно давно Felix теперь использует Gogo (реализующий стандарт OSGi). Поэтому вы должны проверить http://felix.apache.org/site/rfc-147-overview.html, чтобы предоставить новую команду.

Кроме того, вы можете взглянуть на the iPOJO Arch command for Gogo. Он использует iPOJO.

+0

Спасибо, я наткнулся на вчерашний код Arch, который на самом деле помог мне придумать рабочую версию сейчас. – qqilihq

Смежные вопросы