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 【问题描述】:我想将 named 和 unnamed 参数都传递给 main 方法。
目前我将参数传递为:
java -jar myfile.jar param1 param2
并将它们处理为:
public static void main(String[] args) throws IOException
String param1 = args[0];
String param2 = args[1];
但是,我想以更动态的方式传递参数 - 即:
-
我可以同时传递 named 和 unnamed 参数;
我可以使用它们的名称获取/处理这些参数;
我不需要每次执行 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 中的节点