4

我尝试使用 Common CLI 解析简单的参数,但收到 ParseException。

这是我的代码:

@SuppressWarnings("static-access")
public class CmdParsingTest {
    private static final Options options;

    static {
        options = new Options();
        options.addOption(OptionBuilder.withLongOpt("schema-file")
                .withDescription("path to schema file")
                .hasArg()
                .withArgName("schemaFile")
                .create("source"));
        options.addOption( OptionBuilder.withLongOpt("state-url")
                .withDescription("state url")
                .hasArg()
                .withArgName("stateUrl")
                .create("url"));
        options.addOption( OptionBuilder.withLongOpt("update-number")
                .withDescription("update number to start from")
                .hasArg()
                .withArgName("updateNum")
                .create("update"));
        options.addOption(OptionBuilder.withLongOpt("result-file")
                .withDescription("use given file to save result")
                .hasArg()
                .withArgName("resultFile")
                .create("result"));
    }

    public static void main(String[] args) {
        args = new String[]{
                "-source /home/file/myfile.txt",
                "-url http://localhost/state",
                "-result result.txt"};
        // create the parser
        CommandLineParser parser = new BasicParser();
        try {
            // parse the command line arguments
            CommandLine cmd = parser.parse(options, args);
            //other cool code...    
        }
        catch( ParseException exp ) {
            System.err.println( "Parsing of command line args failed.  Reason: " + exp.getMessage() );
        }
    }
}

结果是:

命令行参数解析失败。原因:无法识别的选项:-source /home/file/myfile.txt

如果我使用不带破折号的 args,则不会引发异常,但cmd.hasOption("source")返回 false。

PS> Usage sample 建议使用DefaultParser,但它只会出现在 CLI 1.3 中(根据 1.3 JavaDoc)。

4

1 回答 1

8

改变

    args = new String[]{
            "-source /home/file/myfile.txt",
            "-url http://localhost/state",
            "-result result.txt"};

    args = new String[]{
            "-source", "/home/file/myfile.txt",
            "-url", "http://localhost/state",
            "-result", "result.txt"};

第二个是 JVM 如何将命令行参数打包/传递给您的 main 方法,因此是 commons-cli 所期望的。

于 2013-07-03T13:24:00.453 回答