доступ к аргументам командной строки из пакета OSGi - PullRequest
7 голосов
/ 12 января 2009

У меня есть приложение, которое работает как набор OSGi-пакетов. Я запускаю его, используя очень маленькую оболочку, которая встраивает структуру Felix. Необходимость этой обертки меня немного раздражает, так же как и тот факт, что она зависит от Феликса (тогда как само приложение могло бы работать так же хорошо, скажем, в Equinox), поэтому я хочу избавиться от него и использовать Felix по умолчанию пусковая.

Единственное, что на самом деле делает обертка, - это передает аргументы командной строки в запущенную среду OSGi, чтобы на них мог реагировать пакет. Обратите внимание, что на самом деле он не анализирует аргументы, просто помещает строку [] в мое приложение.

Существует ли стандартный способ (или, по крайней мере, стандартный метод Феликса) для доступа к параметрам командной строки из пакета, чтобы я мог покончить с пользовательским модулем запуска?

Ответы [ 4 ]

7 голосов
/ 30 ноября 2012

Если вы используете bnd (инструменты), вы можете использовать его лаунчер. Он регистрирует аргументы командной строки как служебное свойство 'launcher.arguments'.

Это работает очень хорошо, когда вы комбинируете это с командой bnd package. Эта команда берет проект bnd или файл bndrun, описывающий работающую среду (комплекты, свойства, инфраструктуру) и превращается в автономный основной jar Таким образом, вы разрабатываете и отлаживаете в bndtools, и когда вы счастливы, вы превращаете его в один исполняемый файл. Пример:

@Component
public class MyApp {
   String args;

   @Activate
   void activate() { 
      System.out.println("Args: " + args);
   }

   @Reference(target="(launcher.arguments=*)")
   void args( Object object, Map<String,Object> map) {
       args = (String) map.get("launcher.arguments");
   }
}

# to turn into an executable
bnd package myapp.bnd
java -jar myapp.jar -a somearg *.file
2 голосов
/ 20 мая 2009

Поздний ответ, но, возможно, кто-то найдет его полезным.

У меня была такая же проблема. Мое приложение работает в OSGi, но у меня есть внешние интерфейсы, которым я должен соответствовать, что подразумевает чтение аргументов командной строки.

Ключ к этому определен в новой спецификации OSGi 4.2, а именно Запуск платформы. Вы можете прочитать об этом в спецификации черновика (см. Draft на www.osgi.org) в разделе «Уровень жизненного цикла».

Это стандартный способ запуска платформы OSGi (любая реализация, поддерживающая OSGi 4.2) из ​​автономного Java-приложения. Отличная вещь заключается в том, что вам не нужно знать, какую реализацию вы запускаете (Felix, Equinox, ...), пока она находится в CLASSPATH.

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

Начиная с Equinox 3.5M6 (думаю, по крайней мере, M6) это поддерживается. Последняя версия Apache Felix также поддерживает это.

1 голос
/ 05 января 2013

Мне известно, что вы искали только Феликса. Тогда это решение только для Равноденствия может оказаться бесполезным. Я оставляю это здесь, потому что кто-то еще может наткнуться на этот вопрос и запустить Equinox.

Из любой связки и любой структуры это может быть сложно. Если вы используете точку расширения org.eclipse.core.runtime.applications, это должно быть легко. Условие: вы НЕ передаете -console как параметр.

public class Application implements IApplication {

    @Override
    public Object start(IApplicationContext context) throws Exception {
        String[] args = (String[])context.getArguments().get("application.args");
        // args.length == 0 if no arguments have been passed
    }
}

Ссылка в plugin.xml

 <plugin>
    <extension
          id="myApp"
          point="org.eclipse.core.runtime.applications">
        <application>
          <run class="package.Application" />
        </application>  
    </extension>
 </plugin>
1 голос
/ 19 января 2009

Наверное, нет. Я думаю, что стандартная программа запуска Felix выполняет некоторую проверку командной строки и принимает в качестве аргумента только dir кэша пакета. Более одного аргумента, и программа запуска закрывается.

Вы можете использовать системные свойства для передачи информации в командной строке, и я думаю, что она работает не только в felix, но и в других контейнерах osgi, но, вероятно, делает ваше приложение не очень удобным для пользователя.

...