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

unhi4e5o  于 2023-05-05  发布在  Java
关注(0)|答案(4)|浏览(175)

我想把 namedunnamed 参数都传递给main方法。
目前我传递参数为:

java -jar myfile.jar param1 param2

并将它们处理为:

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

然而,我想以一种更动态的方式传递参数-即,这样:
1.我可以传递 namedunnamed 参数;
1.我可以用它们的 * 名字 * 来获取/处理这些参数;
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]
     .....
}

我很乐意与一些外部库一起工作,这将使我的工作更容易。
我已经看过this了,它并不全面。
如何完成任务有什么建议吗?

atmip9wb

atmip9wb1#

Apache Commons CLI是我用来解析java命令行参数的工具。可以找到here的示例,并可用于执行以下任何选项格式:

  • 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
bt1cpqcv

bt1cpqcv2#

根据@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的答案。

g0czyy6m

g0czyy6m3#

只要参数和名称不包含空格--你可以得到所有的参数和名称,在“=”键处拆分,并将键/值对添加到HashMap中。以后你可以使用key来获取任何你想要的值。
编辑:如果你不想在Map中添加一些元素,那么如果这些元素不包含“=”键,你可以忽略它们。

zphenhs4

zphenhs44#

目前我不知道解决“-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; }
}

相关问题