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

时间:2017-12-23 18:40:17

标签: java terminal command-line-interface

目前我正在与现有的Java项目进行争论,我的目标是创建一个命令行界面,用于将参数传递给它,以便“运行”它,可以这么说。

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

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();
    }
  }
}

在Eclipse中,我可以通过修改传递给Arguments的{​​{1}}来运行此操作,但是,我实际喜欢做的是,能够运行这个程序来自终端shell,与“普通”终端程序类似,例如Run Configurations...grep

如何使用Java实现这一目标?

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

4 个答案:

答案 0 :(得分:1)

我认为你更好的选择是重写现有程序的另一个主要方法来接受CLI args,但如果你想这样做,无论哪种方式,你需要将程序编译成类或jar文件

您可以像运行CLI中的任何其他Java程序一样运行它,但在此处为其提供-h之类的参数。注意:您需要在此处包含Apache Commons的类路径。

java - cp <classpath> fully.qualified.CommandLineParameters -h

或者,如果您的清单中有一个带有Main类属性的JAR,并且还包含Apache Commons(通过超级jar),那么就不需要设置类名或类路径。尽管如此,请提供论据

java -jar jarFile.jar -h
  

我希望它是一个独立的程序,可以从命令行访问,例如ls

打开你的bashrc和put in an alias or function。事实上,你必须调用java,或者你可以使用不同的JVM脚本语言,比如Groovy

$ cat my-ls
#!/usr/bin/env groovy 
println "Run my other program"
$ chmod +x my-ls

$ ./my-ls
Run my other program

答案 1 :(得分:1)

提供的答案描述了如何构建可以使用java -jar命令执行的jar。以下文章介绍了如何使用这样一个可执行文件&#39; jar并将其转换为&#39;程序&#39;文件可由sh执行(因此可以使用./program而不是java -jar program.jar调用):https://coderwall.com/p/ssuaxa/how-to-make-a-jar-file-linux-executable

这个想法是zip存档(和jar基本上是zip存档的味道)可能有任意序幕。序言是从文件开头到zip文件签名(4个字符,其中前两个是&#39; PK&#39;)的所有内容。当java读取jar存档时,它会跳过该序言(签名前的所有内容)。

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

这意味着您可以使用shell脚本添加常用的jar内容,该脚本将仅使用与参数相同的jar存档调用java -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

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

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

答案 2 :(得分:0)

这肯定是可能的。解析参数后,您可以从System.in读取并写入System.out。这里有一个非常简单的示例,用于将输入转换为大写 - 不完整(错误处理等),只是为了展示如何开始:

package sf;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Sample {

    public static void main(String[] args) {
        processArguments(args);
        try {
            processInput(System.in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void processArguments(String[] args) {
        // whatever
    }

    private static void processInput(InputStream in) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line.toUpperCase());
        }
        in.close();
    }
}

并执行它只需使用类型

java sf.Sample -a <input.txt >out.txt

包含sf所在目录的Sample.class目录必须位于CLASSPATH中,或者必须使用-cp命令java选项:{{3 }}

答案 3 :(得分:0)

你应该从java代码创建一个可执行jar:

  1. 在Eclipse中右键单击主文件
  2. Choice Export-&gt; excecutable jar file
  3. 填写表格。采取&#34;启动配置&#34;您的测试运行配置
  4. 从命令行启动您的应用程序:

    java -jar CommandLineParameters.jar --param1 -param2 ...