Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建Java程序的命令行接口,从终端运行_Java_Terminal_Command Line Interface - Fatal编程技术网

创建Java程序的命令行接口,从终端运行

创建Java程序的命令行接口,从终端运行,java,terminal,command-line-interface,Java,Terminal,Command Line Interface,目前我正在与一个现有的Java项目争论,我的目标是创建一个命令行接口,用于向它传递参数,可以说是“运行”它 我用的是,像这样: import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.HelpFormatter; impo

目前我正在与一个现有的Java项目争论,我的目标是创建一个命令行接口,用于向它传递参数,可以说是“运行”它

我用的是,像这样:

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中,我可以通过修改传递给
运行配置…
参数来运行这个程序,然而,实际上我想做的是,能够从终端外壳以类似于“普通”终端程序的方式运行这个程序,如
grep
ipconfig

如何使用Java实现这一点

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

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

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

java - cp <classpath> fully.qualified.CommandLineParameters -h
我希望它是一个独立的程序,可以从命令行访问,例如
ls

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

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


我认为更好的选择是重写现有程序的另一个主要方法以接受CLI args,但如果您想这样做,则需要将程序编译为类或jar文件

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

java - cp <classpath> fully.qualified.CommandLineParameters -h
我希望它是一个独立的程序,可以从命令行访问,例如
ls

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

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


这当然是可能的。解析参数后,您可以从
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
java sf.Sample-a out.txt

包含
示例.class
所在的
sf
目录的目录必须位于类路径中,或者您必须对
java
命令使用
-cp
选项:。

,这当然是可能的。解析参数后,您可以从
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
java sf.Sample-a out.txt

包含
示例.class
所在的
sf
目录的目录必须位于类路径中,或者您必须使用
java
命令的
-cp
选项:。

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

  • 在Eclipse中,右键单击主文件
  • 选择导出->可执行jar文件
  • 填写表格。将测试中的运行配置作为“启动配置”
  • 从命令行启动应用程序:

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

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

  • 在Eclipse中,右键单击主文件
  • 选择导出->可执行jar文件
  • 填写表格。将测试中的运行配置作为“启动配置”
  • 从命令行启动应用程序:

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

    提供的答案描述了如何构建一个可以使用
    java-jar
    命令执行的jar。下面的文章解释了如何获取这样一个“可执行”jar,并将其转换为可通过
    sh
    执行的“程序”文件(因此它可以通过
    /program
    调用,而不是通过
    java-jar program.jar
    调用):

    其思想是
    zip
    存档(而
    jar
    基本上是
    zip
    存档的一种风格)可能有任意的开场白。开场白是从文件开始到
    zip
    文件签名的全部内容(4个字符,前两个是“PK”)。当java读取一个
    jar
    归档文件时,它会跳过这个开场白(签名之前的所有内容)

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

    这意味着您可以使用一个shell脚本预先编写普通的jar内容,该脚本将只调用
    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
    
    它查找
    java
    ,并用所需的参数启动它。这只是一个示例,您可以调整用于查找
    java
    命令的算法,使其适合您的需要


    生成的文件将由这个启动器shell脚本和jar文件(包含主类和清单)的连接组成,jar文件应该使用
    java-jar

    运行。提供的答案描述了如何构建一个jar,该jar可以使用
    java-jar
    命令执行。下面的文章解释了如何获取这样一个“可执行”jar,并将其转换为可通过
    sh
    执行的“程序”文件(因此它可以通过
    /program
    调用,而不是通过
    java-jar program.jar
    调用):

    其思想是
    zip
    存档(而
    jar
    基本上是
    zip
    存档的一种风格)