Выполнять команды консоли OSGI программно - PullRequest
0 голосов
/ 18 июня 2019

Может ли кто-нибудь предоставить рабочий пример того, как программно выполнять команды консоли OSGI?

Я загружаю OSGI через код и хочу выполнить команды консоли OSGI (я получаю команды через другую систему).Это то, что я делаю как простой тест:

ServiceLoader<FrameworkFactory> frameworkFactoryService = ServiceLoader.load(FrameworkFactory.class);
FrameworkFactory frameworkFactory = frameworkFactoryService.iterator().next();

Map<String, String> config = new HashMap<String,String>();
config.put("org.osgi.framework.storage", "../workspace/.config");
config.put("org.osgi.framework.storage.clean", "onFirstInit");

framework = frameworkFactory.newFramework(config);

framework.init();
framework.start();  

// install required bundles
String bundleLocation = "org.eclipse.equinox.common_3.8.0.20181108-1144.jar";
Bundle bundle = framework.getBundleContext().installBundle(bundleLocation);

bundleLocation = "org.eclipse.update.configurator_3.4.2.M20090103-1001-RCP20181108-1144.jar";
bundle = framework.getBundleContext().installBundle(bundleLocation);
bundle.start();

bundleLocation = "org.apache.felix.gogo.runtime_0.10.0.v201209301036.jar";
bundle = framework.getBundleContext().installBundle(bundleLocation);
bundle.start();

bundleLocation = "org.apache.felix.gogo.command_0.10.0.v201209301215.jar";
bundle = framework.getBundleContext().installBundle(bundleLocation);
bundle.start();

bundleLocation = "org.apache.felix.gogo.shell_0.10.0.v201212101605.jar";
bundle = framework.getBundleContext().installBundle(bundleLocation);
bundle.start();

bundleLocation = "org.eclipse.equinox.console_1.1.200.v20150929-1405.jar";
bundle = framework.getBundleContext().installBundle(bundleLocation);
bundle.start();

CommandProcessorImpl commandProcessor = new CommandProcessorImpl();
CommandSession commandSession = commandProcessor.createSession(System.in, System.out, System.err);

commandSession.execute("ss");

Все загружается правильно, и если я программно перебираю все пакеты, я вижу, что все загружено и запущено.К сожалению, я получаю исключение «Команда не найдена: ss» в строке «Выполнить».Что я делаю неправильно?Кто-нибудь с простым рабочим примером?

1 Ответ

2 голосов
/ 18 июня 2019

Вы начинаете CommandProcessImpl самостоятельно. Вместо этого вы должны получить услугу CommandProcessor. Созданный вами экземпляр не имеет связи с платформой и поэтому не может найти никаких команд, зарегистрированных в качестве служб.

 BundleContext context = framework.getBundleContext();
 ServiceReference<CommandProcessor> cpr = 
     context.getServiceReference(CommandProcessor.class);
 CommandProcessor cp = context.getService(cpr);

 CommandSession session = cp.createSession(System.in, System.out, System.err);

 session.execute("lsb");

Очевидно, этот код не защищен. Получение справки о сервисе, а затем получение сервиса действительно плохо, так как сервисы могут приходить и уходить.

bnd имеет удаленного агента (biz.aQute.bnd.remote), который можно легко вызвать из внешнего процесса. В нем также есть программа bndremote, которую вы можете запустить на любом компьютере, а затем загрузить на нее пакеты framework +. Это может быть проще, чем строить это самостоятельно?

...