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

标签 java kotlin command-line jvm command-line-interface

我正在用 Kotlin (Java) 创建一个 CLI 程序。我想将主函数/类绑定(bind)到单个命令,例如 program .
但是,从我在网上搜索的内容来看,运行 Java 程序的唯一方法似乎是使用命令 java。 .例如,java -jar program.jar args , 或 java -cp "..." Program args .但是用户每次打字都很不方便,我用BFG的时候就遇到过这种情况,一个用 Java 编写的命令行存储库清理工具。
我可以使用别名,但是当用户安装我的 CLI 程序时,没有标准的方法可以向系统添加别名。比如大部分人都用Bash,所以我得把别名设置为.bashrc.profile ,但其他人可能会使用 zshcsh , 不是 .profile .
我也可以用 native 程序包装它,但我需要用 native 语言编写它只是为了重定向命令,我不妨用那种语言重写整个东西。
在 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 $0)/.. ; pwd)

java -cp $HELLO_LOCATION/lib/hello.jar Hello $*
一切就绪后,您可以自由放置 your_app文件系统中的任何位置。所有你需要做的(让它可见),就是把 hello.shPATH .所以,你告诉人们这样做:
export PATH=${SOME_LOCATION}/your_app/bin:${PATH}
从现在开始,每个人都可以做到:
> hello.sh hello
Hello: hello
您也可以(为方便起见)在 /usr/bin 中创建符号链接(symbolic link)。或 /usr/local/bin .
如果您打算发布多个版本的代码,那么值得一看的是:modules .
你可以在这里阅读它们:https://www.owsiak.org/modules-as-a-convenient-way-of-choosing-build-chain-on-macos/
sample 目标 macOS但会为 Linux也是。

关于java - 为 Java 程序分配自己的命令的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62759694/

相关文章:

java - 为什么 'concat'不改变字符串?

java - 如何设置bean的Exchange到ProducerTemplate

java - jquery.js 没有在 Tomcat 中加载

batch-file - "Start"命令在运行批处理文件时不起作用

php - 使用 CLI 运行脚本时 PHP 中的识别环境

command-line - Erlang:如何访问 CLI 标志(参数)作为应用程序环境变量?

java - 部署在 Tomcat 上的 Jersey 应用程序返回 404

kotlin - 在 Intellij IDE 中编译 Kotlin 时无法删除缓存目录

android - 微调器 onItemSelected() 没有被调用

generics - 用Kotlin retrofit 转换器:类型推断失败