目前我正在与现有的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实现这一目标?
注意: 我不是试图从命令行编译/构建这个程序,我试图在命令行中为程序创建接口。
答案 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:
从命令行启动您的应用程序:
java -jar CommandLineParameters.jar --param1 -param2 ...