为 Java 程序分配自己的命令的最简单方法是什么?

What is the simplest way to assign a Java program its own command?

我正在用 Kotlin (Java) 创建一个 CLI 程序。我想将主 function/class 绑定到单个命令,例如 program.

然而,根据我在网上搜索的内容,似乎 运行 一个 Java 程序的唯一方法是使用命令 java。例如,java -jar program.jar argsjava -cp "..." Program args。但是用户每次输入都很不方便,这是我在使用BFG时遇到的,这是一个用Java.

编写的命令行存储库清理工具。

我可以使用别名,但是当用户安装我的 CLI 程序时,没有标准的方法可以为系统添加别名。例如,大多数人使用 Bash,因此我必须将别名安装为 .bashrc.profile,但其他人可能会使用 zshcsh,这不'读 .profile.

我也可以用本地程序包装它,但我需要用本地语言编写它只是为了重定向命令,我也可以用该语言重写整个程序。

在Node.js中,开发者可以简单地在他们的package.json中指定他们的命令,通过npm i -g安装这个包的每个人都可以使用这个命令。在 JVM 语言中最简单的替代方法是什么?

如果我是你,我会按照以下方式组织事情:

your_app
|-- Hello.java
|-- bin
|   `-- hello.sh
`-- lib
    `-- hello.jar

里面Hello.java有一个简单的代码:

public class Hello {
  public static void main(String [] arg) {
    if(arg.length > 0) {
      System.out.println("Hello: " + arg[0]);
    }
  }
}

你可以这样构建它:

> javac Hello.java
> jar cf lib/hello.jar Hello.class

请注意,为了简单起见,我采用了丑陋的方式。你绝对应该看看叫做 Manifest - https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html

的东西

然后,在 hello.sh 里面你可以放类似这样的东西:

#!/bin/bash

export HELLO_LOCATION=${HELLO_LOCATION:-$(cd $(dirname [=13=])/.. ; pwd)

java -cp $HELLO_LOCATION/lib/hello.jar Hello $*

一切就绪后,您可以随意将 your_app 放入文件系统中的任何位置。您所要做的(让它可见)就是将 hello.sh 放在 PATH 上。所以,你告诉人们去做:

export PATH=${SOME_LOCATION}/your_app/bin:${PATH}

从现在开始,每个人都可以做到:

> hello.sh hello
Hello: hello

您也可以(为了方便)在 /usr/bin/usr/local/bin.

中创建符号 link

如果您打算发布多个版本的代码,值得一看的东西是:modules.

您可以在这里阅读它们:https://www.owsiak.org/modules-as-a-convenient-way-of-choosing-build-chain-on-macos/

示例目标 macOS 但也适用于 Linux