命令行通過入參調用jar包


                                                                                    命令行通過入參調用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,歡迎與我交流:

https://github.com/Thinker-Mars/Demo/tree/master/stat

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM