命令行通过入参调用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,我这里不细说了。
public class DtOptions { public static Options generateOp() {
final Options options = new Options();
options.addOption(new Option("ant", "ant", false, "command help"));
options.addOption(new Option("t", "type", true, "database type"));
options.addOption(new Option("l", "url", true, "database url"));
options.addOption(new Option("u", "username", true, "database username"));
options.addOption(new Option("p", "password", true, "database password"));
return options;
}
}
//构建Options对象
Options options = new Options();
//设置一个命令项有4个参数,第一个是命令简称,第二个是命令全称
//第三个参数指定命令项是否为必填项,第四个是此命令的说明
options.addOption(new Option("ant", "ant", false, "command help"));
3、解析入参
public class Entrance { public static void main(String[] args) throws ClassNotFoundException, ParseException {
// create the parser
CommandLineParser parser = new DefaultParser();
Options options = DtOptions.generateOp();
CommandLine line = parser.parse(options, args);
try {
if (line.hasOption("ant")) {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp("ant", options);
} else {
Database database = dealArgs.getDatabase(parser, options, args);
Connection conn = CreateConnection.create(database);
conn.close();
}
} catch (ParseException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} }
}
public class dealArgs { public static Database getDatabase(CommandLineParser parser, Options options, String[] args) throws ParseException { Database database = new Database();
CommandLine line = parser.parse(options, args); if (line.hasOption("t")) {//数据库类型
database.setType(line.getOptionValue("t"));
}
if (line.hasOption("l")) {//url
database.setUrl(line.getOptionValue("l"));
}
if (line.hasOption("u")) {//用户名
database.setUsername(line.getOptionValue("u"));
}
if (line.hasOption("p")) {//密码
database.setPassword(line.getOptionValue("p"));
}
return database; }
}
入参均在主类的args数组中被传入,我们需要做的就是将已经定义好的命令行参数规则引入,并通过CommandLineParser对象解析即可。
至此,把项目打成jar包后,就已经可以通过入参来调用它了,命令如下:
java -jar stat.jar -t 0 -l jdbc:mysql://localhost:3306 -u root -p root
如果使用者不知道需要哪些入参或是无法调用的话,可使用如下命令查看入参要求:
java -jar stat.jar -ant
什么?你问我为什么?仔细观察主类,有这么一段代码:
HelpFormatter formatter = new HelpFormatter();
//设置命令行入参时,我定义了一个叫做ant的入参
//此入参即用来展示程序入参信息
formatter.printHelp("ant", options);
其他的代码就是根据入参中的数据库类型建立数据库连接,代码我这里就不贴出来了,大家可以去github上查看。
三、项目打包
可参考下面这篇博文,讲的很好
https://blog.csdn.net/rogerxue12345/article/details/84344753
四、其他
项目已上传至github,欢迎与我交流:
最新文章
- 错误信息:attempt to create saveOrUpdate event with null entity
- Windows下的Memcache安装
- Ubuntu 12.04 Virtualbox 启用USB 设备支持
- Android抓包方法(三)之Win7笔记本Wifi热点+WireShark工具
- Android Intent不可传递大数据
- css z-index属性
- Effective C++学习笔记 条款02:尽量以const,enum,inline替换 #define
- What is Cross Linux From Scratch?
- []cp,转载]提示MyEclipse Trial Expired,如何手动获取MyEclipse 注册码!很牛!
- centos下安装chdmg
- 谈谈PHP、Python与Ruby
- Java Class 字节码文件结构详解
- Python基础1:一些小知识汇总
- 2014百度之星预赛(第二场)——Best Financing
- Anroid ListView分组和悬浮Header实现
- python进阶学习(二)
- fail2ban 防止ssh暴力破解
- Java集合框架相关知识整理
- Good Bye 2018 A. New Year and the Christmas Ornament
- Blender3d做大型项目真实地形快速建模