Завершите работу контейнера OSGi после выполнения некоторого кода (для создания инструмента командной строки) - PullRequest
1 голос
/ 10 января 2020

Я хотел бы создать инструмент командной строки, который запускает среду OSGi, чтобы повторно использовать код, который опирается на OSGi.

В ответе доступ к аргументам командной строки из пакета OSGi , я понял, как я могу прочитать аргументы командной строки:

@Component
public class Example {

    String[] args;

    @Activate
    void activate() {
        System.out.println("Hello World");
        System.out.println(args.length + " args:");
        for (String s : args) {
            System.out.println(" - " + s);
        }
    }

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

Но теперь, когда я запускаю собранный jar (bnd-export-maven-plugin), вот так:

java -jar <path-to>/application.jar lorem ipsum

I получить ожидаемый результат, но приложение не завершает работу.

Прочитав 4.2.6 Остановка фреймворка , я подумал, что мне нужно вызвать stop() в системном комплекте. Я попытался изменить свой код на:

@Activate
void activate(BundleContext bundleContext) {
    System.out.println("Hello World");
    System.out.println(args.length + " args:");
    for (String s : args) {
        System.out.println(" - " + s);
    }
    try {
        bundleContext.getBundle().stop();
    } catch (BundleException e) {
        e.printStackTrace();
    }
}

Но, похоже, он не работает так.

1 Ответ

2 голосов
/ 10 января 2020

Если вы хотите, чтобы системный пакет остановился, вы должны сделать (обратите внимание на 0):

 bundleContext.getBundle(0).stop();

Чтобы сделать эту гипер-корректность, вы должны сделать это в другом потоке.

@Component
public class ServiceComponent {

    @Activate
    void activate(BundleContext c) {
        CompletableFuture.runAsync( ()-> {
            try {
                c.getBundle(0).stop();
            } catch (BundleException e) {
                e.printStackTrace();
            }
        } );        
    }
}

Это, конечно, самоубийственный компонент ...

...