为 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 args
或 java -cp "..." Program args
。但是用户每次输入都很不方便,这是我在使用BFG时遇到的,这是一个用Java.
编写的命令行存储库清理工具。
我可以使用别名,但是当用户安装我的 CLI 程序时,没有标准的方法可以为系统添加别名。例如,大多数人使用 Bash,因此我必须将别名安装为 .bashrc
或 .profile
,但其他人可能会使用 zsh
或 csh
,这不'读 .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
。
我正在用 Kotlin (Java) 创建一个 CLI 程序。我想将主 function/class 绑定到单个命令,例如 program
.
然而,根据我在网上搜索的内容,似乎 运行 一个 Java 程序的唯一方法是使用命令 java
。例如,java -jar program.jar args
或 java -cp "..." Program args
。但是用户每次输入都很不方便,这是我在使用BFG时遇到的,这是一个用Java.
我可以使用别名,但是当用户安装我的 CLI 程序时,没有标准的方法可以为系统添加别名。例如,大多数人使用 Bash,因此我必须将别名安装为 .bashrc
或 .profile
,但其他人可能会使用 zsh
或 csh
,这不'读 .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
.
如果您打算发布多个版本的代码,值得一看的东西是:modules.
您可以在这里阅读它们:https://www.owsiak.org/modules-as-a-convenient-way-of-choosing-build-chain-on-macos/
示例目标 macOS
但也适用于 Linux
。