我想把命名的和未命名的参数都传递给主方法。
目前我传递的参数为:
java -jar myfile.jar param1 param2
并按
处理public static void main(String[] args) throws IOException {
String param1 = args[0];
String param2 = args[1];
}
然而,我想以一种更动态的方式传递参数——即:
- 我可以传递命名和未命名参数;
- 我可以获取/处理这些参数的名称;
- 每次执行main方法时,我不需要以相同的顺序传递它们。
以类似这样的方式传递:
java -jar myJar param3name=param3 param2name=param2 param1name=param1 param5 param6
并以如下方式处理:
public static void main(String[] args) throws IOException {
//something like
String param3 = getvaluemethod("param3name");
String param1 = getvaluemethod("param1name");
.....
String param5 = args[n]
String param6 = args[n+1]
.....
}
我很高兴使用一些外部库,这将使我的工作更容易。
我已经看过这个了,它不全面。
对于如何完成任务有什么建议吗?
Apache Commons CLI是我用来解析java命令行参数的。可以在这里找到示例,这些示例可用于执行以下任何选项格式:
- POSIX类选项(即。
tar -zxvf foo.tar.gz
) - GNU喜欢长选项(例如。
du --human-readable --max-depth=1
) - Java类属性(即。
java -Djava.awt.headless=true -Djava.net.useSystemProxies=true Foo
) - 有价值的短选项(例如:
gcc -O2 foo.c
) - 带有单个连字符的长选项(例如:
ant -projecthelp
)
根据@Mac70的回答和一些补充,
private static Map<String, String> map;
private static void makeMap(String[] args) {
map = new HashMap<>();
for (String arg : args) {
if (arg.contains("=")) {
//works only if the key doesn't have any '='
map.put(arg.substring(0, arg.indexOf('=')),
arg.substring(arg.indexOf('=') + 1));
}
}
}
public static void main(String[] args) {
makeMap(args);
//..
String param3 = map.get("param3name");
String param1 = map.get("param1name");
}
如果你需要更广泛的东西,你需要看看@Archangel33的答案
只要参数和名称不包含空格-您可以获得所有这些,在"="键处分割并将键/值对添加到HashMap中。之后你可以使用key获取任何你想要的值。
编辑:如果您不想添加一些元素到映射中,那么如果这些元素不包含"="键,则可以忽略它们。
目前我不知道解决"-drop-value abc"的最佳实践是什么,但通常最好是检索值"-drop-value=abc"
import java.util.HashMap;
public class ArgumentParser {
public HashMap<Integer, String> index;
public String[] arguments;
public HashMap<String, String> named_arguments;
public ArgumentParser(String[] args) {
String arg;
for (int i = 0; i < args.length; i++) {
arg = args[i];
if (arg.startsWith("--") || arg.startsWith("-")) {
String[] split = arg.split("="); // Split on the first occurrence of "="
// Raise an error if the key is already in the dictionary
if (this.named_arguments.containsKey(split[0])) {
throw new IllegalArgumentException("Argument " + split[0] + " already exists.");
}
if (split.length == 1) {
this.named_arguments.put(split[0], null); // If there is no "="
} else {
this.named_arguments.put(split[0], split[1]);
}
this.index.put(i, split[1]);
} else {
this.arguments[i] = arg;
this.index.put(i, arg);
}
}
}
public HashMap<Integer, String> GetIndex() { return this.index; }
public String[] GetArguments() { return this.arguments; }
public HashMap<String, String> GetNamedArguments() { return this.named_arguments; }
}