将Base64字符串作为选项传递给Apache Commons-CLI解析器

时间:2016-11-03 20:48:30

标签: java base64 apache-commons-cli

我构建了一个Java webstart应用程序,它需要接收Base64参数作为命令行参数。

我使用Apache Common-CLI来解析JNLP内部的参数。只有两个参数,其中一个是JSON,在这个JSON中有一个Base64字符串。

问题是Base64字符串在末尾填充了" =" (等于字符/等号),并且解析器无法将字符串识别为参数的一部分,而是尝试评估" ="作为参数的键=值分隔符,它会抛出以下异常:org.apache.commons.cli.UnrecognizedOptionException: Unrecognized option

有没有办法逃避这个char,或者让解析器忽略它?

使用以下代码构建CLI选项:

Option appletBehaviourConfigJSONOption = Option.builder("J")
            .longOpt("appletBehaviourConfigJSON")
            .hasArg()
            .argName("JSON")
            .desc("JSON config")
            .build();
clioptions.addOption(appletBehaviourConfigJSONOption);

CommandLineParser cliparser = new DefaultParser();
CommandLine cmd = null;
try {
    cmd = cliparser.parse(clioptions, args);
} catch (ParseException e) {
    e.printStackTrace();
}

它是从JNLP调用的:

<argument>-appletBehaviourConfigJSON { "appletBehaviourSignatureType": "HASH", "appletBehaviourHashList": [{"id": "1234", "hash": "ZjQzZDM1NTJiYzBhYmZmMDBlNTc0NjIyZDExMDhhM2Y5MmVlOWJjZAo="}, {"id": "5678", "hash": "ZjQzZDM1NTJiYzBhYmZmMDBlNTc0NjIyZDExMDhhM2Y5MmVlOWJjZAo="}], "appletBehaviourCookies": [{"name": "JSESSIONID", "value": "2edee5627c84937f707bdd390b1c"}, {"name": "STICKY", "value": "ASD123213123adsf"}], "appletBehaviourPostURL": "http://example.org", "stampSelection": "WHITE", "setStampAll": true}</argument>

当我更改&#39; =&#39;到了&#39;在两个哈希上,解析器按预期工作(但是该选项现在当然具有无效的Base64)。

1 个答案:

答案 0 :(得分:0)

似乎commons-cli不会像等号一样处理选项的名称和值之间的空白。

因此,尝试使用等号而不是空白,如

-appletBehaviourConfigJSON={...