创建 Java 程序的命令行界面,从终端运行

sma*_*ish 1 java terminal command-line-interface

目前我正在处理一个现有的 Java 项目,我的目标是创建一个命令行界面来向它传递参数,可以这么说来“运行”它。

我正在使用Apache commons cli 库,如下所示:

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class CommandLineParameters {

  public static void main(String[] args) {
    CommandLineParser parser = new DefaultParser();
    Options options = new Options();

    options.addOption("a", "abc", true, "First Parameter");
    options.addOption("x", "xyz", true, "Second Parameter");
    options.addOption("h", "help", false, "Shows this Help");

    try {
      CommandLine commandLine = parser.parse(options, args);

      System.out.println(commandLine.getOptionValue("a"));
      System.out.println(commandLine.getOptionValue("x"));

      if (commandLine.hasOption("h")) {
        HelpFormatter formatter = new HelpFormatter();
        formatter.printHelp("CommandLineParameters", options);
      }

    } catch (ParseException e) {
      e.printStackTrace();
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

在Eclipse中,我可以通过修改运行此Arguments传递给Run Configurations...然而,我会在实际上做的是,要能够从终端shell中运行这个程序,以类似的方式“正常”终端程序,例如grep,或ipconfig

如何使用 Java 实现这一点?

注意: 我不是要从命令行编译/构建这个程序,我是想在命令行中创建程序的接口

Rom*_*kiy 5

提供的答案描述了如何构建可以使用java -jar命令执行的 jar 。以下文章解释了如何获取这样的“可执行”jar 并将其转换为可执行的“程序”文件sh(因此可以使用./program和 不使用java -jar program.jar):https : //coderwall.com/p/ssuaxa/how- to-make-a-jar-file-linux-executable

这个想法是zip存档(并且 ajar基本上是zip存档的一种风格)可能有一个任意的序言。序言是从文件开头到zip文件签名的所有内容(4 个字符,其中前两个是“PK”)。当 java 读取jar存档时,它会跳过该序言(签名之前的所有内容)。

所以从 的角度来看java,这样的 jar 将是一个有效的 jar。但是,如果该序言是一个 shell 脚本,那么这样的 jar 也将是一个可以使用 shell 解释器执行的文件。

这意味着您可以在通常的 jar 内容之前添加一个 shell 脚本,该脚本将java -jar使用相同的 jar 存档作为参数调用它。并且java会愉快地执行,jar而忽略序言。

文章的序言是这样的:

#!/bin/sh
MYSELF=`which "$0" 2>/dev/null`
[ $? -gt 0 -a -f "$0" ] && MYSELF="./$0"
java=java
if test -n "$JAVA_HOME"; then
    java="$JAVA_HOME/bin/java"
fi
exec "$java" $java_args -jar $MYSELF "$@"
exit 1
Run Code Online (Sandbox Code Playgroud)

它查找java并使用所需的参数启动它。这只是一个示例,您可以调整用于 findjava命令的算法以使其适合您的需要。

生成的文件将包含此启动程序 shell 脚本和应使用 .jar 运行的 jar 文件(包含主类和清单)的串联java -jar