创建Java程序的命令行接口,从终端运行
目前我正在与一个现有的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
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
存档的一种风格)