命令行通過入參調用jar包
最近因為項目需要,需要實現一個功能,即定時執行服務器上的一個腳本去對數據庫的數據進行業務處理,要操作的數據庫有很多種,mysql、db2、oracle、sqlserver等等,但是shell目前我還不熟悉,所以就先用java去實現,打成一個jar包,通過入參即可調用不同的數據庫,滿足了要求。網上搜了一下,大家多使用了Apache Commons-CLI包進行命令行參數解析,但是說的都不太清楚,我在這里結合自己的實際操作進行總結,希望能夠幫助到有需要的朋友。
我這里因為項目有引到的包只有幾個,所以沒有選擇通過maven管理項目,只是構建了一個java project,引入了我需要的jar包,比如我希望對mysql進行操作,那肯定需要mysql驅動包對吧。
一、項目目錄
Entrance.java即為程序的主類,DtOptions.java是對命令行參數的設置,DT.java是一個常量類,指明了數據庫類型,dealArgs.java是對入參進行處理,Database.java連接數據庫用的實體類,CreateConnection.java用來處理相關數據庫連接操作。
二、項目開發
1、相關jar包引入
上圖可以看到,引入了Apache Commons-CLI包和mysql驅動包,這里我以操作mysql為例,大家根據需要自行引入即可。
2、設置命令行參數
大家有興趣可以閱讀官方指導https://commons.apache.org/proper/commons-cli/usage.html,我這里不細說了。
1 public class DtOptions { 2 3 public static Options generateOp() { 4 final Options options = new Options(); 5 options.addOption(new Option("ant", "ant", false, "command help")); 6 options.addOption(new Option("t", "type", true, "database type")); 7 options.addOption(new Option("l", "url", true, "database url")); 8 options.addOption(new Option("u", "username", true, "database username")); 9 options.addOption(new Option("p", "password", true, "database password")); 10 return options; 11 } 12 }
1 //構建Options對象 2 Options options = new Options(); 3 //設置一個命令項有4個參數,第一個是命令簡稱,第二個是命令全稱 4 //第三個參數指定命令項是否為必填項,第四個是此命令的說明 5 options.addOption(new Option("ant", "ant", false, "command help"));
3、解析入參
1 public class Entrance { 2 3 public static void main(String[] args) throws ClassNotFoundException, ParseException { 4 // create the parser 5 CommandLineParser parser = new DefaultParser(); 6 Options options = DtOptions.generateOp(); 7 CommandLine line = parser.parse(options, args); 8 try { 9 if (line.hasOption("ant")) { 10 HelpFormatter formatter = new HelpFormatter(); 11 formatter.printHelp("ant", options); 12 } else { 13 Database database = dealArgs.getDatabase(parser, options, args); 14 Connection conn = CreateConnection.create(database); 15 conn.close(); 16 } 17 } catch (ParseException e) { 18 e.printStackTrace(); 19 } catch (SQLException e) { 20 e.printStackTrace(); 21 } 22 23 } 24 }
1 public class dealArgs { 2 3 public static Database getDatabase(CommandLineParser parser, Options options, String[] args) throws ParseException { 4 5 Database database = new Database(); 6 CommandLine line = parser.parse(options, args); 7 8 if (line.hasOption("t")) {//數據庫類型 9 database.setType(line.getOptionValue("t")); 10 } 11 if (line.hasOption("l")) {//url 12 database.setUrl(line.getOptionValue("l")); 13 } 14 if (line.hasOption("u")) {//用戶名 15 database.setUsername(line.getOptionValue("u")); 16 } 17 if (line.hasOption("p")) {//密碼 18 database.setPassword(line.getOptionValue("p")); 19 } 20 return database; 21 22 } 23 }
入參均在主類的args數組中被傳入,我們需要做的就是將已經定義好的命令行參數規則引入,並通過CommandLineParser對象解析即可。
至此,把項目打成jar包后,就已經可以通過入參來調用它了,命令如下:
1 java -jar stat.jar -t 0 -l jdbc:mysql://localhost:3306 -u root -p root
如果使用者不知道需要哪些入參或是無法調用的話,可使用如下命令查看入參要求:
1 java -jar stat.jar -ant
什么?你問我為什么?仔細觀察主類,有這么一段代碼:
1 HelpFormatter formatter = new HelpFormatter(); 2 //設置命令行入參時,我定義了一個叫做ant的入參 3 //此入參即用來展示程序入參信息 4 formatter.printHelp("ant", options);
其他的代碼就是根據入參中的數據庫類型建立數據庫連接,代碼我這里就不貼出來了,大家可以去github上查看。
三、項目打包
可參考下面這篇博文,講的很好
https://blog.csdn.net/rogerxue12345/article/details/84344753
四、其他
項目已上傳至github,歡迎與我交流: