我一直在努力了解如何打包我们的应用程序,以便我们可以在一个Docker镜像中运行多个命令。

我们的设置
bootstrap/Mainpicocli入口点,它注册其他命令,即HttpServerCliCommandOneCliCommandTwo等。这些命令可以在其他模块/软件包中定义。该应用程序与Gradle应用程序插件打包为JAR。默认情况下,不带参数,将使用HttpServer命令。这是可能的,因为在HttpServer命令中,我们可以显式启动HTTP服务器(我们现在使用https://jooby.io/框架)。

Docker镜像已部署到k8s。因此,我们有一个正在运行的服务器,同时,我们可以将exec放入容器并运行另一个CLI命令。

问题

我们想切换到另一个框架,例如Quarkus,Micronaut或Spring。看起来这些框架允许您启动HTTP服务器(或WebSocket)或创建CLI命令,但无法复制我们现在拥有的内容,即将多个命令打包在一个JAR中并能够在其中启动一个Docker镜像

我们想到的解决方案

我能想到的是Kafka使用的一种方法:据我所知,它们有一个JAR,然后使用许多sh脚本(https://github.com/apache/kafka/tree/trunk/bin)运行不同的类https://github.com/apache/kafka/blob/trunk/bin/kafka-run-class.sh。这似乎太适合我们了。

当然,我们可以使用main方法为每个类生成单独的JAR,然后创建不同的Docker镜像并以某种方式找到运行它们的方法。但这对于Docker镜像而言似乎是一项开销。如果我们需要20条命令怎么办?

因此,我正在寻找一种方法来打包应用程序,以具有多个可执行的“命令”。我什至不确定这是个好主意。很高兴听到可能的选择或最佳做法。

最佳答案

我在Micronaut中找到了一种方法。

Controller :

@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]

关于java - 如何打包具有多个入口点的Java应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59721084/

10-16 09:19