一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 使用 commons-cli 解析 Java 中的命令行選項(xiàng)

使用 commons-cli 解析 Java 中的命令行選項(xiàng)

2021-08-19 23:47Linux中國(guó)Seth Kenlon Java教程

通常向終端中輸入命令時(shí),無(wú)論是啟動(dòng) GUI 應(yīng)用程序還是僅啟動(dòng)終端應(yīng)用程序,都可以使用 命令行選項(xiàng)options or switches or flags (以下簡(jiǎn)稱選項(xiàng))來(lái)修改應(yīng)用程序的運(yùn)行方式。這是 POSIX 規(guī)范 設(shè)定的標(biāo)準(zhǔn),因此能夠檢測(cè)和解析選項(xiàng)對(duì) Jav

讓用戶用命令行選項(xiàng)調(diào)整你的 Java 應(yīng)用程序運(yùn)行方式。

使用 commons-cli 解析 Java 中的命令行選項(xiàng)

通常向終端中輸入命令時(shí),無(wú)論是啟動(dòng) GUI 應(yīng)用程序還是僅啟動(dòng)終端應(yīng)用程序,都可以使用 命令行選項(xiàng)options or switches or flags (以下簡(jiǎn)稱選項(xiàng))來(lái)修改應(yīng)用程序的運(yùn)行方式。這是 POSIX 規(guī)范 設(shè)定的標(biāo)準(zhǔn),因此能夠檢測(cè)和解析選項(xiàng)對(duì) Java 程序員而言是很有用的技能。

Java 中有若干種解析選項(xiàng)的方法,其中我最喜歡用的是 Apache Commons CLI 庫(kù),簡(jiǎn)稱 commons-cli。

安裝 commons-cli

如果你使用類似 Maven 之類的項(xiàng)目管理系統(tǒng)以及集成開(kāi)發(fā)環(huán)境Integrated Development Environment(簡(jiǎn)稱 IDE),可以在項(xiàng)目屬性(比如 pom.xml 配置文件或者 Eclipse 和 NetBeans 的配置選項(xiàng)卡)中安裝 Apache Commons CLI 庫(kù)。

而如果你采用手動(dòng)方式管理庫(kù),則可以從 Apache 網(wǎng)站下載 該庫(kù)的最新版本。下載到本地的是幾個(gè)捆綁在一起的 JAR 文件,你只需要其中的一個(gè)文件 commons-cli-X.Y.jar(其中 X 和 Y 代指最新版本號(hào))。把這個(gè) JAR 文件或手動(dòng)或使用 IDE 添加到項(xiàng)目,就可以在代碼中使用了。

將庫(kù)導(dǎo)入至 Java 代碼

在使用 commons-cli 庫(kù)之前,必須首先導(dǎo)入它。對(duì)于本次選項(xiàng)解析的簡(jiǎn)單示例而言,可以先在 Main.java 文件中簡(jiǎn)單寫入以下標(biāo)準(zhǔn)代碼:

  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 中解析選項(xiàng)的準(zhǔn)備工作已經(jīng)做好了。

在 Java 中定義布爾選項(xiàng)

要實(shí)現(xiàn)解析選項(xiàng),首先要定義應(yīng)用程序可接收的有效選項(xiàng)。使用 Option(注意是單數(shù))類來(lái)創(chuàng)建選項(xiàng)對(duì)象,使用 Options(注意是復(fù)數(shù))類來(lái)追蹤項(xiàng)目中創(chuàng)建的所有選項(xiàng)。

首先為選項(xiàng)創(chuàng)建一個(gè)組,按照慣例命名為 options:

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

接下來(lái),通過(guò)列出短選項(xiàng)(即選項(xiàng)名簡(jiǎn)寫)、長(zhǎng)選項(xiàng)(即全寫)、默認(rèn)布爾值(LCTT 譯注:設(shè)置是否需要選項(xiàng)參數(shù),指定為 false 時(shí)此選項(xiàng)不帶參,即為布爾選項(xiàng))和幫助信息來(lái)定義選項(xiàng),然后設(shè)置該選項(xiàng)是否為必需項(xiàng)(LCTT 譯注:下方創(chuàng)建 alpha 對(duì)象的代碼中未手動(dòng)設(shè)置此項(xiàng)),最后將該選項(xiàng)添加到包含所有選項(xiàng)的 options 組對(duì)象中。在下面幾行代碼中,我只創(chuàng)建了一個(gè)選項(xiàng),命名為 alpha:

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

在 Java 中定義帶參選項(xiàng)

有時(shí)用戶需要通過(guò)選項(xiàng)提供 true 或 false 以外的信息,比如給出配置文件、輸入文件或諸如日期、顏色這樣的設(shè)置項(xiàng)值。這種情況可以使用 builder 方法,根據(jù)選項(xiàng)名簡(jiǎn)寫為其創(chuàng)建屬性(例如,-c 是短選項(xiàng),--config 是長(zhǎng)選項(xiàng))。完成定義后,再將定義好的選項(xiàng)添加到 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 函數(shù)可以用來(lái)設(shè)置短選項(xiàng)、長(zhǎng)選項(xiàng)、是否為必需項(xiàng)(本段代碼中必需項(xiàng)設(shè)置為 true,也就意味著用戶啟動(dòng)程序時(shí)必須提供此選項(xiàng),否則應(yīng)用程序無(wú)法運(yùn)行)、幫助信息等。

使用 Java 解析選項(xiàng)

定義并添加所有可能用到的選項(xiàng)后,需要對(duì)用戶提供的參數(shù)進(jìn)行迭代處理,檢測(cè)是否有參數(shù)同預(yù)設(shè)的有效短選項(xiàng)列表中的內(nèi)容相匹配。為此要?jiǎng)?chuàng)建命令行 CommandLine 本身的一個(gè)實(shí)例,其中包含用戶提供的所有參數(shù)(包含有效選項(xiàng)和無(wú)效選項(xiàng))。為了處理這些參數(shù),還要?jiǎng)?chuàng)建一個(gè) CommandLineParser 對(duì)象,我在代碼中將其命名為 parser。最后,還可以創(chuàng)建一個(gè) HelpFormatter 對(duì)象(我將其命名為 helper),當(dāng)參數(shù)中缺少某些必需項(xiàng)或者用戶使用 --help 或 -h 選項(xiàng)時(shí),此對(duì)象可以自動(dòng)向用戶提供一些有用的信息。

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

最后,添加一些條件判斷來(lái)分析用戶提供的選項(xiàng),我們假設(shè)這些選項(xiàng)已經(jīng)作為命令行輸入被獲取并存儲(chǔ)在 cmd 變量中。這個(gè)示例應(yīng)用程序有兩種不同類型的選項(xiàng),但對(duì)這兩種類型都可以使用 .hasOption 方法加上短選項(xiàng)名稱來(lái)檢測(cè)選項(xiàng)是否存在。檢測(cè)到一個(gè)存在的選項(xiàng)后,就可以對(duì)數(shù)據(jù)做進(jìn)一步操作了。

  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); 

解析過(guò)程有可能會(huì)產(chǎn)生錯(cuò)誤,因?yàn)橛袝r(shí)可能缺少某些必需項(xiàng)如本例中的 -c 或 --config 選項(xiàng)。這時(shí)程序會(huì)打印一條幫助信息,并立即結(jié)束運(yùn)行。考慮到此錯(cuò)誤(Java 術(shù)語(yǔ)中稱為異常),在 main 方法的開(kāi)頭要添加語(yǔ)句聲明可能的異常:

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

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

測(cè)試代碼

你可以通過(guò)調(diào)整傳遞給代碼的默認(rèn)參數(shù)來(lái)在 IDE 中測(cè)試應(yīng)用程序,或者創(chuàng)建一個(gè) JAR 文件并在終端運(yùn)行測(cè)試。這個(gè)過(guò)程可能會(huì)因 IDE 的不同而不同。具體請(qǐng)參閱相應(yīng)的 IDE 文檔,以及我寫過(guò)的關(guān)于如何創(chuàng)建 JAR 文件的文章,或者參考 Daniel Oh 的關(guān)于如何使用 Maven 執(zhí)行同樣操作的文章。

首先,省略必需項(xiàng) -c 或 --config 選項(xiàng),檢測(cè)解析器的異常處理:

  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 

然后提供輸入選項(xiàng)再進(jìn)行測(cè)試:

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

選項(xiàng)解析

為用戶提供選項(xiàng)功能對(duì)任何應(yīng)用程序來(lái)說(shuō)都是很重要的。有了 Java 和 Apache Commons,要實(shí)現(xiàn)這個(gè)功能并不難。

以下是完整的演示代碼,供讀者參考:

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

使用 Java 和選項(xiàng)

選項(xiàng)使用戶可以調(diào)整命令的工作方式。使用 Java 時(shí)解析選項(xiàng)的方法有很多,其中之一的 commons-cli 是一個(gè)強(qiáng)大而靈活的開(kāi)源解決方案。記得在你的下一個(gè) Java 項(xiàng)目中嘗試一下哦。

原文地址:https://linux.cn/article-13699-1.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品一区二区久久不卡 | 欧美亚洲另类在线观看 | 艾秋麻豆果冻传媒老狼仙踪林 | 精品久久99麻豆蜜桃666 | 特级夫妻大片免费在线播放 | 国产免费看黄的私人影院 | 国产欧美日韩专区 | 91制片厂免费观看 | 糖心在线观看网 | 亚洲乱码一区二区三区国产精品 | 国产精品欧美日韩一区二区 | 青青草视频破解版 | 好大好硬快点好爽公 | 日本人成年视频在线观看 | 99在线免费播放 | 精品国产免费一区二区三区 | 五月天网站 | 古代色翁荡熄 | 4444kk在线看片| 国产精品香蕉在线观看不卡 | 国内视频一区二区 | 日本人成在线视频免费播放 | 草莓视频旧版本 | 亚洲视频99 | 亚洲国产三级在线观看 | 日韩欧美在线视频一区二区 | 亚洲 欧美 另类 中文 在线 | 欧美三级小说 | 精品国产免费第一区二区三区日韩 | 欧美日韩国产最新一区二区 | 欧美交换乱理伦片120秒 | 肉浦团在线观看 | 无码AV精品一区二区三区 | 五月天精品视频在线观看 | 手机跑分排行最新排名 | caoporm国产精品视频免费 | 日韩免费高清完整版 | 6个老师的尿奴 | 国产精品女同久久免费观看 | 精品国产福利在线观看一区 | 欧美成人aa久久狼窝动画 |