Как упаковать приложение Java с несколькими точками входа - PullRequest
2 голосов
/ 13 января 2020

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

Наша установка

bootstrap/Main является точкой входа picocli , которая регистрирует другие команды, например HttpServer, CliCommandOne, CliCommandTwo и т. Д. c. Эти команды могут быть определены в других модулях / пакетах. Приложение упаковано как JAR с плагином Gradle. По умолчанию без параметров будет использоваться команда HttpServer. Это возможно, потому что в команде HttpServer мы можем явно запустить HTTP-сервер (сейчас мы используем https://jooby.io/ framework).

Образ Docker развернут на k8s , Итак, у нас запущен сервер, и в то же время мы можем exec войти в контейнер и запустить другую команду CLI.

Проблема

Мы хотим переключиться на другую структуру, например, Quarkus, Micronaut или Spring. И похоже, что эти инфраструктуры позволяют вам запускать HTTP-сервер (или WebSocket) или создавать команду CLI, но нет способа скопировать то, что у нас есть сейчас, то есть упаковать несколько команд в один JAR и иметь возможность запускать их в one Docker image.

Решения, о которых мы думали

Что я могу придумать, так это подход, который использует Кафка: у них есть один JAR, насколько я понять, а затем использовать множество sh сценариев (https://github.com/apache/kafka/tree/trunk/bin) для запуска различных классов https://github.com/apache/kafka/blob/trunk/bin/kafka-run-class.sh. Это кажется нам слишком индивидуальным.

Конечно, мы можем сгенерировать отдельные JAR-файлы для каждого класса с помощью метода main, а затем создать различные Docker образы и каким-то образом найти способ их запуска. Но это похоже на накладные расходы с точки зрения Docker изображений. Что если нам понадобится 20 команд?

Поэтому я ищу способ упаковки приложения, чтобы иметь несколько исполняемых «команд». Я даже не уверен, хорошая ли это идея. Был бы рад услышать о возможных вариантах или лучших практиках.

1 Ответ

1 голос
/ 16 января 2020

Я нашел способ сделать это в Micronaut.

Контроллер:

@Controller("/hello")
public class MyController {
    @Get(produces = MediaType.TEXT_PLAIN)
    public String hello() {
        return "hello";
    }
}

Команда сервера HTTP:

@Command(name = "http-server", description = "Starts HTTP server")
public class HttpApp implements Runnable {
    @Override
    public void run() {
        Micronaut.run(HttpApp.class);
    }
}

Пример команды Cli:

@Command(name = "cli-one", description = "test cli command one")
public class CliCommandOne implements Runnable {
    @Override
    public void run() {
        System.out.println("hello from CliCommandOne");
    }
}

Основной класс:

@Command(name = "main-command",
        description = "Description of a main command",
        mixinStandardHelpOptions = true,
        subcommands = {HttpApp.class, CliCommandOne.class})
public class Application implements Runnable {

    @Override
    public void run() {
        System.out.println("hello from CLI main command");
    }

    public static void main(String[] args) throws Exception {
        PicocliRunner.run(Application.class, args);
    }
}

Получение справки по всем доступным командам (с Gradle):

› gw run --args='--help'
11:37:20.928 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [cli]
Usage: main-command [-hV] [COMMAND]
Description of a main command
  -h, --help      Show this help message and exit.
  -V, --version   Print version information and exit.
Commands:
  http-server  Starts HTTP server
  cli-one      test cli command one

Запуск CliCommandOne:

› gw run --args='cli-one'
11:37:32.423 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [cli]
hello from CliCommandOne

Запустить HTTP-сервер:

gw run --args='http-server'
11:37:40.491 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [cli]
11:37:41.263 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 307ms. Server Running: http://localhost:8081
<=========----> 75% EXECUTING [2s]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...