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




Возможно нет. Я думаю, что стандартная программа запуска 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 также поддерживает это.
Я бы отдал миллион долларов за несколько ссылок, добавленных в этот ответ
Я согласен с тем, что запуск OSGI-фреймворка довольно хорошо описан, но не столько «передача аргументов в ваш пакет».
Если вы используете 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[].
Я знаю, что вы искали только Феликса. Тогда это решение, предназначенное только для 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>
Как это обернулось? Вы выбрали вариант запуска фреймворка вместо параметров JVM -D? Если да, можно ли будет опубликовать информацию о вашем решении? Спасибо.