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

Posted

技术标签:

【中文标题】Java:将命名和未命名参数的组合传递给可执行的 jar/main 方法【英文标题】:Java: Passing combination of named and unnamed parameters to executable jar/main method 【发布时间】:2014-09-13 13:05:57 【问题描述】:

我想将 namedunnamed 参数都传递给 main 方法。

目前我将参数传递为:

 java -jar myfile.jar param1 param2

并将它们处理为:

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

但是,我想以更动态的方式传递参数 - 即:

    我可以同时传递 namedunnamed 参数; 我可以使用它们的名称获取/处理这些参数; 我不需要每次执行 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已经看过了,不全面。

关于如何完成任务的任何意见?

【问题讨论】:

【参考方案1】:

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

【讨论】:

我查看了 Commons CLI 和 args4j。两者都很好,但我要使用 args4j。我觉得它更容易 args4j 也是不错的选择。我之所以使用 CLI,是因为很久以前我就被高级开发人员告知要在项目中使用它,所以我一直都是这样做的。从来没有真正看过 args4j,但现在可以看看还有什么。 JSAP 是要走的路...martiansoftware.com/jsap 对于简单的命令行应用程序来说似乎有些矫枉过正,但它很快就会得到回报。【参考方案2】:

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

【讨论】:

【参考方案3】:

只要参数和名称不包含空格 - 您可以获取所有参数,在“=”键处拆分并将键/值对添加到 HashMap。稍后您可以使用 key 获取任何您想要的值。

编辑:如果您不想在地图中添加一些元素,那么如果这些元素不包含“=”键,则可以忽略它们。

【讨论】:

感谢您的回复。 :) 如果值中有“=”怎么办? 如果你不想使用任何库,你可以以这种格式传递参数:“key”="value" - 这样你可以搜索“= key”而不是 = key (但整个事情需要更多的解析)。您也可以使用其他不会使用的键来代替 =。 好吧,如果值部分允许使用= 作为键,则没有意义。您可以转义= 或使用"",就像@Mac70 建议的那样。

以上是关于Java:将命名和未命名参数的组合传递给可执行的 jar/main 方法的主要内容,如果未能解决你的问题,请参考以下文章

混合命名和未命名函数参数

将命名空间从 java 传递给 xslt,并使用 java 中的参数作为 xslt 中的节点

命名和未命名类型

为什么这个函数重命名作为参数传递的LinkedList节点?

将 Rails 参数哈希传递给命名路由的更有效方法

命名类型和未命名类型和基础类型