sma*_*ish 1 java terminal command-line-interface
目前我正在处理一个现有的 Java 项目,我的目标是创建一个命令行界面来向它传递参数,可以这么说来“运行”它。
我正在使用Apache commons cli 库,如下所示:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在Eclipse中,我可以通过修改运行此Arguments
传递给Run Configurations...
然而,我会在实际上做的是,要能够从终端shell中运行这个程序,以类似的方式“正常”终端程序,例如grep
,或ipconfig
。
如何使用 Java 实现这一点?
注意: 我不是要从命令行编译/构建这个程序,我是想在命令行中创建程序的接口。
提供的答案描述了如何构建可以使用java -jar
命令执行的 jar 。以下文章解释了如何获取这样的“可执行”jar 并将其转换为可执行的“程序”文件sh
(因此可以使用./program
和 不使用java -jar program.jar
):https : //coderwall.com/p/ssuaxa/how- to-make-a-jar-file-linux-executable
这个想法是zip
存档(并且 ajar
基本上是zip
存档的一种风格)可能有一个任意的序言。序言是从文件开头到zip
文件签名的所有内容(4 个字符,其中前两个是“PK”)。当 java 读取jar
存档时,它会跳过该序言(签名之前的所有内容)。
所以从 的角度来看java
,这样的 jar 将是一个有效的 jar。但是,如果该序言是一个 shell 脚本,那么这样的 jar 也将是一个可以使用 shell 解释器执行的文件。
这意味着您可以在通常的 jar 内容之前添加一个 shell 脚本,该脚本将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
Run Code Online (Sandbox Code Playgroud)
它查找java
并使用所需的参数启动它。这只是一个示例,您可以调整用于 findjava
命令的算法以使其适合您的需要。
生成的文件将包含此启动程序 shell 脚本和应使用 .jar 运行的 jar 文件(包含主类和清单)的串联java -jar
。
归档时间: |
|
查看次数: |
12659 次 |
最近记录: |