Java:将命名和未命名参数的组合传递给可执行的jar/main方法



我想把命名的未命名的参数都传递给主方法。

目前我传递的参数为:

 java -jar myfile.jar param1 param2

并按

处理
public static void main(String[] args) throws IOException {
    String param1 = args[0];
    String param2 = args[1];
}

然而,我想以一种更动态的方式传递参数——即:

  1. 我可以传递命名未命名参数;
  2. 我可以获取/处理这些参数的名称;
  3. 每次执行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; }
}

相关内容

  • 没有找到相关文章

最新更新