文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用 commons-cli 解析 Java 中的命令行选项

2024-12-14 01:36

关注

[[418479]]

通常向终端中输入命令时,无论是启动 GUI 应用程序还是仅启动终端应用程序,都可以使用 命令行选项options or switches or flags (以下简称选项)来修改应用程序的运行方式。这是 POSIX 规范 设定的标准,因此能够检测和解析选项对 Java 程序员而言是很有用的技能。

Java 中有若干种解析选项的方法,其中我最喜欢用的是 Apache Commons CLI 库,简称 commons-cli。

安装 commons-cli

如果你使用类似 Maven 之类的项目管理系统以及集成开发环境Integrated Development Environment(简称 IDE),可以在项目属性(比如 pom.xml 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。

而如果你采用手动方式管理库,则可以从 Apache 网站下载 该库的最新版本。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 commons-cli-X.Y.jar(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。

将库导入至 Java 代码

在使用 commons-cli 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 Main.java 文件中简单写入以下标准代码:

  1. package com.opensource.myoptparser; 
  2. import org.apache.commons.cli.*; 
  3. public class Main { 
  4.     public static void main(String[] args) { 
  5.     // code  
  6.     } 

至此在 Java 中解析选项的准备工作已经做好了。

在 Java 中定义布尔选项

要实现解析选项,首先要定义应用程序可接收的有效选项。使用 Option(注意是单数)类来创建选项对象,使用 Options(注意是复数)类来追踪项目中创建的所有选项。

首先为选项创建一个组,按照惯例命名为 options:

  1. //code 
  2. Options options = new Options(); 

接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(LCTT 译注:设置是否需要选项参数,指定为 false 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(LCTT 译注:下方创建 alpha 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 options 组对象中。在下面几行代码中,我只创建了一个选项,命名为 alpha:

  1. //define options 
  2.  Option alpha = new Option("a""alpha"false"Activate feature alpha"); 
  3.  options.addOption(alpha); 

在 Java 中定义带参选项

有时用户需要通过选项提供 true 或 false 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 builder 方法,根据选项名简写为其创建属性(例如,-c 是短选项,--config 是长选项)。完成定义后,再将定义好的选项添加到 options 组中:

  1. Option config = Option.builder("c").longOpt("config"
  2.     .argName("config"
  3.     .hasArg() 
  4.     .required(true
  5.     .desc("set config file").build(); 
  6. options.addOption(config); 

builder 函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 true,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。

使用 Java 解析选项

定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 CommandLine 本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 CommandLineParser 对象,我在代码中将其命名为 parser。最后,还可以创建一个 HelpFormatter 对象(我将其命名为 helper),当参数中缺少某些必需项或者用户使用 --help 或 -h 选项时,此对象可以自动向用户提供一些有用的信息。

  1. // define parser 
  2.     CommandLine cmd; 
  3.     CommandLineParser parser = new BasicParser(); 
  4.     HelpFormatter helper = new HelpFormatter(); 

最后,添加一些条件判断来分析用户提供的选项,我们假设这些选项已经作为命令行输入被获取并存储在 cmd 变量中。这个示例应用程序有两种不同类型的选项,但对这两种类型都可以使用 .hasOption 方法加上短选项名称来检测选项是否存在。检测到一个存在的选项后,就可以对数据做进一步操作了。

  1. try { 
  2.     cmd = parser.parse(options, args); 
  3.     if(cmd.hasOption("a")) { 
  4.     System.out.println("Alpha activated"); 
  5.     } 
  6.     if (cmd.hasOption("c")) { 
  7.     String opt_config = cmd.getOptionValue("config"); 
  8.     System.out.println("Config set to " + opt_config); 
  9.     } 
  10. } catch (ParseException e) { 
  11.     System.out.println(e.getMessage()); 
  12.     helper.printHelp("Usage:", options); 
  13.     System.exit(0); 

解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 -c 或 --config 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为异常),在 main 方法的开头要添加语句声明可能的异常:

  1. public static void main(String[] args) throws ParseException { 

示例程序至此就大功告成了。

测试代码

你可以通过调整传递给代码的默认参数来在 IDE 中测试应用程序,或者创建一个 JAR 文件并在终端运行测试。这个过程可能会因 IDE 的不同而不同。具体请参阅相应的 IDE 文档,以及我写过的关于如何创建 JAR 文件的文章,或者参考 Daniel Oh 的关于如何使用 Maven 执行同样操作的文章。

首先,省略必需项 -c 或 --config 选项,检测解析器的异常处理:

  1. $ java -jar dist/myapp.jar                  
  2. Missing required option: c 
  3. usage: Usage: 
  4.  -a,--alpha             Activate feature alpha 
  5.  -c,--config <config>   Set config file 

然后提供输入选项再进行测试:

  1. java -jar dist/myantapp.jar --config foo -a 
  2. Alpha activated 
  3. Config set to foo 

选项解析

为用户提供选项功能对任何应用程序来说都是很重要的。有了 Java 和 Apache Commons,要实现这个功能并不难。

以下是完整的演示代码,供读者参考:

  1. package com.opensource.myapp; 
  2. import org.apache.commons.cli.*; 
  3. public class Main { 
  4.      
  5.       
  6.     public static void main(String[] args) throws ParseException { 
  7.         // define options 
  8.         Options options = new Options(); 
  9.          
  10.         Option alpha = new Option("a""alpha"false"Activate feature alpha"); 
  11.         options.addOption(alpha); 
  12.          
  13.         Option config = Option.builder("c").longOpt("config"
  14.                 .argName("config"
  15.                 .hasArg() 
  16.                 .required(true
  17.                 .desc("Set config file").build(); 
  18.         options.addOption(config); 
  19.       
  20.         // define parser 
  21.         CommandLine cmd; 
  22.         CommandLineParser parser = new BasicParser(); 
  23.         HelpFormatter helper = new HelpFormatter(); 
  24.         try { 
  25.             cmd = parser.parse(options, args); 
  26.             if(cmd.hasOption("a")) { 
  27.                 System.out.println("Alpha activated"); 
  28.             } 
  29.            
  30.             if (cmd.hasOption("c")) { 
  31.                 String opt_config = cmd.getOptionValue("config"); 
  32.                 System.out.println("Config set to " + opt_config); 
  33.             } 
  34.         } catch (ParseException e) { 
  35.             System.out.println(e.getMessage()); 
  36.             helper.printHelp("Usage:", options); 
  37.             System.exit(0); 
  38.         } 
  39.     } 

使用 Java 和选项

选项使用户可以调整命令的工作方式。使用 Java 时解析选项的方法有很多,其中之一的 commons-cli 是一个强大而灵活的开源解决方案。记得在你的下一个 Java 项目中尝试一下哦。

来源:Linux.cn内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯