diff --git a/translated/tech/20210813 Parse command options in Java with commons-cli.md b/published/20210813 Parse command options in Java with commons-cli.md similarity index 57% rename from translated/tech/20210813 Parse command options in Java with commons-cli.md rename to published/20210813 Parse command options in Java with commons-cli.md index f4789d23ea..d0923f6214 100644 --- a/translated/tech/20210813 Parse command options in Java with commons-cli.md +++ b/published/20210813 Parse command options in Java with commons-cli.md @@ -3,14 +3,16 @@ [#]: author: "Seth Kenlon https://opensource.com/users/seth" [#]: collector: "lujun9972" [#]: translator: "unigeorge" -[#]: reviewer: " " -[#]: publisher: " " -[#]: url: " " +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13699-1.html" 使用 commons-cli 解析 Java 中的命令行选项 ====== -让用户学会用命令行选项调整你的 Java 应用程序运行方式。 -![Learning and studying technology is the key to success][1] + +> 让用户用命令行选项调整你的 Java 应用程序运行方式。 + +![](https://img.linux.net.cn/data/attachment/album/202108/19/115907lvjwc1ce5avumaau.jpg) 通常向终端中输入命令时,无论是启动 GUI 应用程序还是仅启动终端应用程序,都可以使用 @@ -22,13 +24,13 @@ Java 中有若干种解析选项的方法,其中我最喜欢用的是 [Apache ### 安装 commons-cli -如果你使用类似 [Maven][5] 之类的项目管理系统以及集成开发环境(Integrated Development Environment,简称IDE),可以在项目属性(比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。 +如果你使用类似 [Maven][5] 之类的项目管理系统以及集成开发环境Integrated Development Environment(简称 IDE),可以在项目属性(比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。 而如果你采用手动方式管理库,则可以从 Apache 网站下载 [该库的最新版本][6]。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 `commons-cli-X.Y.jar`(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。 ### 将库导入至 Java 代码 -在使用 **commons-cli** 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 `Main.java` 文件中简单写入以下标准代码: +在使用 `commons-cli` 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 `Main.java` 文件中简单写入以下标准代码: ``` package com.opensource.myoptparser; @@ -36,7 +38,7 @@ package com.opensource.myoptparser; import org.apache.commons.cli.*; public class Main { -    public static void main([String][7][] args) { +    public static void main(String[] args) {     // code      } } @@ -55,20 +57,20 @@ public class Main {     Options options = new Options(); ``` -接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(译注:设置是否需要选项参数,指定为 false 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(译注:下方创建 `alpha` 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中,我只创建了一个选项,命名为 `alpha`: +接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(LCTT 译注:设置是否需要选项参数,指定为 `false` 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(LCTT 译注:下方创建 `alpha` 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中,我只创建了一个选项,命名为 `alpha`: ```     //define options -    [Option][8] alpha = new [Option][8]("a", "alpha", false, "Activate feature alpha"); +    Option alpha = new Option("a", "alpha", false, "Activate feature alpha");     options.addOption(alpha); ``` ### 在 Java 中定义带参选项 -有时用户需要通过选项提供 **true** 或 **false** 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 `builder` 方法,根据选项名简写为其创建属性(例如,`-c` 是短选项,`--config` 是长选项)。完成定义后,再将定义好的选项添加到 `options` 组中: +有时用户需要通过选项提供 `true` 或 `false` 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 `builder` 方法,根据选项名简写为其创建属性(例如,`-c` 是短选项,`--config` 是长选项)。完成定义后,再将定义好的选项添加到 `options` 组中: ``` -    [Option][8] config = [Option][8].builder("c").longOpt("config") +    Option config = Option.builder("c").longOpt("config")         .argName("config")         .hasArg()         .required(true) @@ -76,11 +78,11 @@ public class Main {     options.addOption(config); ``` -`builder`函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 **true**,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。 +`builder` 函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 `true`,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。 ### 使用 Java 解析选项 -定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建 **CommandLine** 命令行本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 **CommandLineParser** 对象,我在代码中将其命名为 `parser`。最后,还可以创建一个 **HelpFormatter** 对象(我将其命名为 `helper`),当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时,此对象可以自动向用户提供一些有用的信息。 +定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 `CommandLine` 本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 `CommandLineParser` 对象,我在代码中将其命名为 `parser`。最后,还可以创建一个 `HelpFormatter` 对象(我将其命名为 `helper`),当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时,此对象可以自动向用户提供一些有用的信息。 ```     // define parser @@ -93,23 +95,23 @@ public class Main { ``` try { -    cmd = parser.parse(options, args); -    if(cmd.hasOption("a")) { -    [System][9].out.println("Alpha activated"); -    } + cmd = parser.parse(options, args); + if(cmd.hasOption("a")) { + System.out.println("Alpha activated"); + } -    if (cmd.hasOption("c")) { -    [String][7] opt_config = cmd.getOptionValue("config"); -    [System][9].out.println("Config set to " + opt_config); -    } -} catch ([ParseException][10] e) { -    [System][9].out.println(e.getMessage()); -    helper.printHelp("Usage:", options); -    [System][9].exit(0); + if (cmd.hasOption("c")) { + String opt_config = cmd.getOptionValue("config"); + System.out.println("Config set to " + opt_config); + } +} catch (ParseException e) { + System.out.println(e.getMessage()); + helper.printHelp("Usage:", options); + System.exit(0); } ``` -解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为 _exception_,异常),在 main 方法的开头要添加语句声明可能的异常: +解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为异常),在 `main` 方法的开头要添加语句声明可能的异常: ``` @@ -146,53 +148,52 @@ Config set to foo 以下是完整的演示代码,供读者参考: - ``` package com.opensource.myapp; import org.apache.commons.cli.*; public class Main { -     -    /** -     * @param args the command line arguments -     * @throws org.apache.commons.cli.ParseException -     */  -    public static void main([String][7][] args) throws [ParseException][10] { -        // define options -        Options options = new Options(); -         -        [Option][8] alpha = new [Option][8]("a", "alpha", false, "Activate feature alpha"); -        options.addOption(alpha); -         -        [Option][8] config = [Option][8].builder("c").longOpt("config") -                .argName("config") -                .hasArg() -                .required(true) -                .desc("Set config file").build(); -        options.addOption(config); -      -        // define parser -        CommandLine cmd; -        CommandLineParser parser = new BasicParser(); -        HelpFormatter helper = new HelpFormatter(); + + /** + * @param args the command line arguments + * @throws org.apache.commons.cli.ParseException + */ + public static void main(String[] args) throws ParseException { + // define options + Options options = new Options(); + + Option alpha = new Option("a", "alpha", false, "Activate feature alpha"); + options.addOption(alpha); + + Option config = Option.builder("c").longOpt("config") + .argName("config") + .hasArg() + .required(true) + .desc("Set config file").build(); + options.addOption(config); + + // define parser + CommandLine cmd; + CommandLineParser parser = new BasicParser(); + HelpFormatter helper = new HelpFormatter(); -        try { -            cmd = parser.parse(options, args); -            if(cmd.hasOption("a")) { -                [System][9].out.println("Alpha activated"); -            } -           -            if (cmd.hasOption("c")) { -                [String][7] opt_config = cmd.getOptionValue("config"); -                [System][9].out.println("Config set to " + opt_config); -            } -        } catch ([ParseException][10] e) { -            [System][9].out.println(e.getMessage()); -            helper.printHelp("Usage:", options); -            [System][9].exit(0); -        } -    } + try { + cmd = parser.parse(options, args); + if(cmd.hasOption("a")) { + System.out.println("Alpha activated"); + } + + if (cmd.hasOption("c")) { + String opt_config = cmd.getOptionValue("config"); + System.out.println("Config set to " + opt_config); + } + } catch (ParseException e) { + System.out.println(e.getMessage()); + helper.printHelp("Usage:", options); + System.exit(0); + } + } } ``` @@ -207,7 +208,7 @@ via: https://opensource.com/article/21/8/java-commons-cli 作者:[Seth Kenlon][a] 选题:[lujun9972][b] 译者:[unigeorge](https://github.com/unigeorge) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出