Доступ к аргументам командной строки из пакета OSGi

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

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

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

Как это обернулось? Вы выбрали вариант запуска фреймворка вместо параметров JVM -D? Если да, можно ли будет опубликовать информацию о вашем решении? Спасибо.

Chris 22.04.2010 23:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
7
1
5 616
4

Ответы 4

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

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

Поздний ответ, но, возможно, кто-то сочтет это полезным.

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

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

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

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

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

Я бы отдал миллион долларов за несколько ссылок, добавленных в этот ответ

Andriy Drozdyuk 19.02.2011 21:03

Я согласен с тем, что запуск OSGI-фреймворка довольно хорошо описан, но не столько «передача аргументов в ваш пакет».

Dan Gravell 03.05.2012 20:18

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

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

@Component
public class MyApp {
   String[] args;

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

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

Чтобы превратиться в исполняемый файл:

bnd package myapp.bnd
java -jar myapp.jar -a somearg *.file

Это отлично работает, но я думаю, что map.get("launcher.arguments") нужно закидывать на String[].

Jmini 10.01.2020 10:50

Я знаю, что вы искали только Феликса. Тогда это решение, предназначенное только для Equinox, может оказаться бесполезным. Я оставляю его здесь, потому что кто-то другой может натолкнуться на этот вопрос и запустить 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>

Другие вопросы по теме