为Java程序分配自己的命令的最简单方法是什么?
我正在用Kotlin Java创建一个CLI程序。我想将主函数/类绑定到单个命令,例如program 然而,从我在线搜索的内容来看,运行Java程序的唯一方法似乎是使用Java命令。例如,java-jar program.jar args或java-cp。。。程序args。但是用户每次输入都非常不方便,这是我在使用Java编写的命令行存储库清理工具时体验到的 我可以使用别名,但在用户安装我的CLI程序时,没有标准方法向系统添加别名。例如,大多数人使用Bash,因此我必须将别名安装到.bashrc或.profile,但其他人可能使用zsh或csh,而zsh或csh不读取.profile 我也可以用本机程序来包装它,但我需要用本机语言来编写它,以便重定向命令,我也可以用该语言重写整个程序为Java程序分配自己的命令的最简单方法是什么?,java,kotlin,command-line,jvm,command-line-interface,Java,Kotlin,Command Line,Jvm,Command Line Interface,我正在用Kotlin Java创建一个CLI程序。我想将主函数/类绑定到单个命令,例如program 然而,从我在线搜索的内容来看,运行Java程序的唯一方法似乎是使用Java命令。例如,java-jar program.jar args或java-cp。。。程序args。但是用户每次输入都非常不方便,这是我在使用Java编写的命令行存储库清理工具时体验到的 我可以使用别名,但在用户安装我的CLI程序时,没有标准方法向系统添加别名。例如,大多数人使用Bash,因此我必须将别名安装到.bashrc
在Node.js中,开发人员只需在package.json中指定他们的命令,通过npmi-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
请注意,为了简单起见,我采用了丑陋的方式。你肯定应该看看所谓的清单-
然后,在hello.sh中,可以放置类似的内容:
#!/bin/bash
export HELLO_LOCATION=${HELLO_LOCATION:-$(cd $(dirname $0)/.. ; pwd)
java -cp $HELLO_LOCATION/lib/hello.jar Hello $*
一旦一切就绪,您就可以自由地将您的应用程序放在文件系统中的任何位置。要使其可见,只需将hello.sh放在路径上。所以,你告诉人们要做:
export PATH=${SOME_LOCATION}/your_app/bin:${PATH}
从现在起,每个人都可以做到:
> hello.sh hello
Hello: hello
为了方便起见,您还可以在/usr/bin或/usr/local/bin内创建符号链接
如果您计划发布多个版本的代码,那么值得一看名为:
您可以在此处阅读有关它们的信息:
示例目标是macOS,但也适用于Linux。如果我是你,我会按照以下方式组织事情:
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
请注意,为了简单起见,我采用了丑陋的方式。你肯定应该看看所谓的清单-
然后,在hello.sh中,可以放置类似的内容:
#!/bin/bash
export HELLO_LOCATION=${HELLO_LOCATION:-$(cd $(dirname $0)/.. ; pwd)
java -cp $HELLO_LOCATION/lib/hello.jar Hello $*
一旦一切就绪,您就可以自由地将您的应用程序放在文件系统中的任何位置。要使其可见,只需将hello.sh放在路径上。所以,你告诉人们要做:
export PATH=${SOME_LOCATION}/your_app/bin:${PATH}
从现在起,每个人都可以做到:
> hello.sh hello
Hello: hello
为了方便起见,您还可以在/usr/bin或/usr/local/bin内创建符号链接
如果您计划发布多个版本的代码,那么值得一看名为:
您可以在此处阅读有关它们的信息:
示例以macOS为目标,但也适用于Linux。只需创建脚本,将java调用封装在其中,并传递参数(如果有)。然后,确保将脚本放在路径上。它应该是.@Oo.Oo那么命令必须是类似于program.sh的东西?这很好,在我的安装程序中,我应该将脚本和.jar一起放在一个通用/bin文件夹中,比如/usr/local/bin吗?或者我应该把它们留在原处并修改$PATH吗?如果您使用Gradle构建项目,最简单的方法是使用。只需创建脚本,将java调用封装在其中,并传递参数(如果有)。然后,确保将脚本放在路径上。它应该是.@Oo.Oo那么命令必须是类似于program.sh的东西?这很好,在我的安装程序中,我应该将脚本和.jar一起放在一个通用/bin文件夹中,比如/usr/local/bin吗?或者我应该把它们放在原地修改$PATH吗?如果你在用Gradle构建项目,最简单的方法是使用.Mmm,这可能是标准方法。但是没有必要使用.sh扩展;大多数已安装的命令都不使用它。请记住,Shell使用文件的第一行而不是文件名来确定如何执行它。通过软件包管理器安装的许多程序,甚至是系统的一部分,实际上都是驱动程序脚本,而不是机器代码可执行文件!那是真的。sh可以省略。一、 就个人而言,更喜欢保留.sh只是为了让用户知道他/她实际上正在运行shell脚本。但这是100%正确的,它不是必需的。不使用.sh的一个原因是您可能希望将驱动程序脚本更改为机器代码可执行文件或其他类型的文件。如果用户需要知道他们正在运行的文件类型是什么,那么更多的文件将使用一个…例如,这个Mac上的/usr/bin有大约600个Mach-O可执行文件、70个shell脚本、160个Perl脚本,以及少量Python、Ruby、PHP和dtrace,其中很少有扩展名!嗯,这可能是标准方法。但是没有必要使用.sh扩展;大多数已安装的命令不支持 使用它。请记住,Shell使用文件的第一行而不是文件名来确定如何执行它。通过软件包管理器安装的许多程序,甚至是系统的一部分,实际上都是驱动程序脚本,而不是机器代码可执行文件!那是真的。sh可以省略。一、 就个人而言,更喜欢保留.sh只是为了让用户知道他/她实际上正在运行shell脚本。但这是100%正确的,它不是必需的。不使用.sh的一个原因是您可能希望将驱动程序脚本更改为机器代码可执行文件或其他类型的文件。如果用户需要知道他们正在运行的文件类型是什么,那么更多的文件将使用一个…例如,这个Mac上的/usr/bin有大约600个Mach-O可执行文件、70个shell脚本、160个Perl脚本,以及少量Python、Ruby、PHP和dtrace,其中很少有扩展名!