将 Base64 字符串作为选项传递给 Apache Commons-CLI 解析器
Passing a Base64 string as an option to Apache Commons-CLI parser
我构建了一个 Java webstart 应用程序,它需要接收一个 Base64 参数作为命令行参数。
我正在使用 Apache Common-CLI 从 JNLP 内部解析参数。只有两个参数,其中一个是 JSON,在这个 JSON 里面有一个 Base64 字符串。
问题是 Base64 字符串在末尾用“=”(等于 char/equal 符号)填充,解析器无法将字符串识别为参数的一部分,而是尝试评估“=”作为参数的键=值分隔符,它抛出以下异常:org.apache.commons.cli.UnrecognizedOptionException: Unrecognized option
有没有办法转义这个字符,或者让解析器忽略它?
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>
当我将两个哈希上的“=”更改为 'a' 时,解析器按预期工作(但该选项现在当然有一个无效的 Base64)。
似乎 commons-cli 不会像处理等号一样处理选项的名称和值之间的空格。
因此尝试使用等号而不是空格,如
-appletBehaviourConfigJSON={...
我构建了一个 Java webstart 应用程序,它需要接收一个 Base64 参数作为命令行参数。
我正在使用 Apache Common-CLI 从 JNLP 内部解析参数。只有两个参数,其中一个是 JSON,在这个 JSON 里面有一个 Base64 字符串。
问题是 Base64 字符串在末尾用“=”(等于 char/equal 符号)填充,解析器无法将字符串识别为参数的一部分,而是尝试评估“=”作为参数的键=值分隔符,它抛出以下异常:org.apache.commons.cli.UnrecognizedOptionException: Unrecognized option
有没有办法转义这个字符,或者让解析器忽略它?
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>
当我将两个哈希上的“=”更改为 'a' 时,解析器按预期工作(但该选项现在当然有一个无效的 Base64)。
似乎 commons-cli 不会像处理等号一样处理选项的名称和值之间的空格。
因此尝试使用等号而不是空格,如
-appletBehaviourConfigJSON={...