代码之家  ›  专栏  ›  技术社区  ›  smatthewenglish

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

  •  1
  • smatthewenglish  · 技术社区  · 8 年前

    目前我正在与一个现有的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 传递给 Run Configurations... 然而,我会 事实上 我想做的是,能够从终端外壳运行此程序,类似于“ 典型的 “终端程序,如 grep ipconfig .

    如何使用Java实现这一点?

    注: 我不是想 编译/生成 这是命令行的程序,我想 界面 到命令行中的程序。

    4 回复  |  直到 8 年前
        1
  •  6
  •   Roman Puchkovskiy    8 年前

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

    我们的想法是 zip 存档(和 jar 基本上是一种 拉链 存档)可能有任意的序言。开场白是从文件开始到 拉链 文件签名(4个字符,前两个是“PK”)。当java读取 罐子 存档时,它跳过了序言(签名之前的所有内容)。

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

    这意味着您可以使用一个shell脚本来预先处理通常的jar内容,该脚本将只调用 java-jar 使用与参数相同的jar存档。和 Java语言 很乐意执行 罐子 忽略开场白。

    本文的序言如下:

    #!/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脚本和jar文件(包含主类和清单)的串联组成,jar文件应该使用 java-jar .

        2
  •  1
  •   OneCricketeer Gabriele Mariotti    7 年前

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

    您可以像从CLI运行任何其他Java程序一样运行它,但要给它提供如下参数 -h 在这里注意:这里需要包含Apache Commons的类路径。

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

    或者,如果您有一个JAR,其清单中有一个Main class属性,并且还包括Apache Commons(通过uber 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
    
        3
  •  0
  •   user85421    8 年前

    这当然是可能的。解析可以读取的参数后 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 必须位于类路径中,或者必须使用 -cp 选项 java 命令: How Classes are Found .

        4
  •  0
  •   slawek    8 年前

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

    1. 在Eclipse中,右键单击主文件
    2. 选择导出->可执行的jar文件
    3. 填写表格。将测试中正在运行的配置作为“启动配置”

    从命令行启动应用程序:

    java -jar CommandLineParameters.jar --param1 -param2 ...
    
    推荐文章