摘要:包執行時傳參的使用姿勢雖說我們現在大多不太直接使用包運行方式,目前比較主流的是將自己的服務丟在某個容器中如,等運行,比如我之前所屬的電商公司,就是將項目打包為包,丟到容器中運行的在使用時,可能會出現直接打包一個可執行的,然后運行,這種時候,
jar包執行時傳參的使用姿勢
雖說我們現在大多不太直接使用jar包運行方式,目前比較主流的是將自己的服務丟在某個容器中(如tomcat,jetty等)運行,比如我之前所屬的電商公司,就是將項目打包為war包,丟到tomcat容器中運行的
在使用SpringBoot時,可能會出現直接打包一個可執行的jar,然后運行,這種時候,通過java命令執行時,時可以傳參的,那么問題來了,main方法可以如何優雅的解析這些傳參呢?
I. 簡陋版本最容易想到的,無非是自己直接解析main方法的傳參,如我們知道的main方法的一般寫法為
public static void main(String[] args) { }
看到上面的寫法,很容易就可以猜到,傳入的參數最終都放到了args數組中,那么該怎么用就怎么用,一個hello world的實例如下
public static void main(String[] args) { System.out.println("hello " + args[0]); }
測試如下:
看到這里,真心感覺沒有什么干貨,上面這些過于小白了吧,估計連入門都算不上,那么參數處理僅止于此么?
II. 進階版本玩過shell的同學應該都知道man命令,可以用來查看很多shell命令的幫助,里面介紹了很多的shell命令的參數說明,而且這些參數一般有縮寫和全拼,而且有些參數可以帶傳值,有些并不需要,可以說shell命令的傳參方式,已經擁有自己獨立的一套規范了,而且用起來非常的爽
那么我們的jar包,能否支持這種傳參方式呢?
舉一個簡單的例子,上面的HelloWord接收一個簡單用戶名參數
不傳入時,默認輸出 hello world
短參方式: -n xxx
長參方式: --name=xxx
僅僅支持這一個場景,需要自己來解析的話,就得寫一長串的代碼,好在這種需求已經有輪子了
1. commons-cli首先引入依賴
commons-cli commons-cli 1.3.1
開始使用,官網已經給出了例子,完整的doc可以參考
commons-cli Usage Scenarios
2. 實例演示下面結合我的一個項目,給出實際的使用方式
@Slf4j public class AppLaunch { private static final String SOURCE_PATH = "./task-core/src/test/java/com/git/hui/task"; private static final String TASK_ARG_LONG = "task"; private static final String TASK_ARG_SHORT = "t"; private static final String ARG_HELP_LONG = "help"; private static final String ARG_HELP_SHORT = "h"; private static volatile boolean run = true; private static void printHelp() { Options options = buildOptions(); HelpFormatter helpFormatter = new HelpFormatter(); helpFormatter.printHelp("java -jar ${jar} [options]", options); } private static Options buildOptions() { Options options = new Options(); options.addOption( Option.builder(TASK_ARG_SHORT).argName(TASK_ARG_LONG).hasArg().longOpt(TASK_ARG_LONG).required(false) .desc("choose task path, default [" + SOURCE_PATH + "]").build()); options.addOption(Option.builder(ARG_HELP_SHORT).longOpt(ARG_HELP_LONG).desc("show command help").build()); return options; } private static CommandLine parseArguments(String[] arguments) { Options options = buildOptions(); CommandLine commandLine = null; try { commandLine = new DefaultParser().parse(options, arguments); } catch (ParseException e) { e.printStackTrace(); System.exit(1); } if (commandLine.hasOption(ARG_HELP_LONG)) { printHelp(); System.exit(0); } return commandLine; } public static void main(String[] args) throws InterruptedException { CommandLine commandLine = parseArguments(args); String scriptSource = commandLine.getOptionValue(TASK_ARG_LONG, SOURCE_PATH); System.out.println("script source: {}" + scriptSource); // .... } }
對上面的使用姿勢進行簡單的說明,從邏輯上劃分,可以分為下面幾塊
定義傳參,包括參數說明,縮寫和全拼,是否有參數值,描述等
解析傳參數組,將具體的傳參解析為CommandLine對象
獲取參數,執行相應的業務邏輯
從源碼角度來看,沒什么復雜或者難以理解的地方,稍稍提一點,參數的定義,即buildOption方法中,上面指定了兩個參數 help, task, 其中一個要求有參數值,一個不需要參數值,下面實際演示如下
III. 其他 0. 相關信息文檔: commons-cli 使用手冊
實際項目:https://github.com/liuyueyi/quick-task
1. 一灰灰Blog: https://liuyueyi.github.io/he...一灰灰的個人博客,記錄所有學習和工作中的博文,歡迎大家前去逛逛
2. 聲明盡信書則不如,已上內容,純屬一家之言,因個人能力有限,難免有疏漏和錯誤之處,如發現bug或者有更好的建議,歡迎批評指正,不吝感激
微博地址: 小灰灰Blog
QQ: 一灰灰/3302797840
3. 掃描關注文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71649.html
摘要:最近自己在做小程序練習,分享一下我遇到的小坑數據更新直接對進行賦值,是無法更新視圖綁定的數據的,會造成數據不一致需要使用更新暫時不支持絕對路徑不能使用靜態文件,只能使用和網絡圖片可以用 最近自己在做小程序練習,分享一下我遇到的小坑 data數據更新 直接對this.data進行賦值,是無法更新視圖綁定的數據的,會造成數據不一致 需要使用this.setData更新 this.dat...
摘要:本文主要對的基本語法進行了小結,方便日后快速查閱使用。另外,因為的語法完全兼容,所以可以把原始的文件改名為后綴,即可直接導入了。為了解決這個問題,允許通過語法的形式指定每個參數的值。后記功能豐富強大,上面的語法小結只是其中的一小部分。 本文主要對 Sass 的基本語法進行了小結,方便日后快速查閱使用。 一、變量($) 1. 變量標識符 Sass 使用 $ 符號來標識變量。 $highl...
閱讀 3493·2023-04-26 02:00
閱讀 3085·2021-11-22 13:54
閱讀 1701·2021-08-03 14:03
閱讀 715·2019-08-30 15:52
閱讀 3092·2019-08-29 12:30
閱讀 2424·2019-08-26 13:35
閱讀 3368·2019-08-26 13:25
閱讀 3003·2019-08-26 11:39