命令行通过入参调用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,欢迎与我交流:
命令行通过入参调用jar包的更多相关文章
- java命令行执行程序解决依赖外部jar包的问题
用java命令行直接执行程序,如果这个程序需要引用外部jar包.就不能单纯用java xx来执行 如果你的jar包和程序就在一个目录: 编译 javac -cp D:\yy\yy.jar,D\xx\x ...
- java命令行从编译到打jar包到执行
目录: 一. javac编译 1. 没有额外的jar包 2. 包含额外的jar包 二. jar打jar包 三. java运行 1. java命令执行 2. jar包执 ...
- java打jar包 命令行cmd在当前路径打jar包
不尝试就永远不会知道真相. 今天搞webservice,需要将服务单独拉出来发布.打jar包的时候要打成aar包,所以用到cmd下的打jar包的命令. 当前路径打jar包,一定要先进到这个文件夹,然后 ...
- java命令行编译和运行引用jar包的文件
经常遇到需要添加第三方jar文件的情况.在命令行状态下要加载外部的jar文件非常麻烦,很不好搞,在网上折腾了很久终于搞定了,在这里做个笔记: 2.运行:java -Djava.ext.dirs=./l ...
- nodejs 命令行获取入参
安装:npm install yargs --save-dev Example index.js const argv = yargs.alias('n', 'name').alias('p', 'p ...
- Python调用jar包中的方法
[本文出自天外归云的博客园] 需求 最近在后台项目代码中一段自定义的AES加解密的程序在平时的测试工作中应用频繁.因为写脚本经常会需要使用,而经过各种尝试,比如jpype等,都不尽如人意.最后转换思路 ...
- html实现调用jar包
整体思路:html引用URL protocol-本地注册表key,key对应某一c#写的exe可执行文件,由exe可执行文件调用cmd,cmd执行jar包. 1.添加注册表: Windows Regi ...
- winform调用jar包
因为工作需要,需要做一个数据上传的程序,客户规定的是:数据接口采用http连接,采用JSON-RPC轻量级远程调用协议.所以决定用winform做一个管理界面(其中还包括其他的功能),java完成数据 ...
- (转载)Python 的 JPype 模块调用 Jar 包
Python 的 JPype 模块调用 Jar 包 背景与需求 最近学习并安装使用了HttpRunner框架去尝试做接口测试,并有后续在公司推广的打算. HttpRunner由Python开发,调用接 ...
随机推荐
- 解读Android MediaPlayer 详细使用方法
MediaPlayer具有非常强大的功能,对音视频的播放均提供了支持,为了保证播放期间系统的正常工作,需要设置"android.permission.WAKE_LOCK"权 ...
- 数据库---T-SQL语句(一)
一.T-SQL语句 1.创建表:create table Name(Code varchar(50),) 主键:primary key 自增长:auto_increment 外键关系:referenc ...
- ssm框架下的文件上传和文件下载
最近在做一个ssm的项目,遇到了添加附件和下载的功能,在网上查了很多资料,发现很多都不好用,经过摸索,发现了一套简便的方法,和大家分享一下. 1.在自己已经构建好的maven web项目中 pom. ...
- mysql 不同版本下 group by 组内排序的差异
最近发现网上找的 group by 组内排序语句在不同的mysql版本中结果不一样. 建表语句: SET FOREIGN_KEY_CHECKS=0; -- ---------------- ...
- Netty 客户端使用指数退避机制实现重连
指数退避 可以理解为每次重连失败时,就把重连时间设置为之前的指数级别.例如 2 秒,4 秒,8 秒...... 亚马逊AWS关于指数退避的两篇文章介绍 AWS 中的错误重试和指数退避 Exponent ...
- springboot的邮件服务
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权归作者所有,转载请注明出处 springboot仍然在狂速发展,才五个多月没有关注,现在看官网已经到1.5.3.RELEA ...
- Python实现性能自动化测试竟然如此简单
一.思考❓❔ 1.什么是性能自动化测试? 性能 系统负载能力 超负荷运行下的稳定性 系统瓶颈 自动化测试 使用程序代替手工 提升测试效率 性能自动化 使用代码模拟大批量用户 让用户并发请求 多页面多用 ...
- centos7更新yum库为aliyun库
1. 备份原来的yum源$sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.设置ali ...
- 跟着阿里p7一起学java高并发 - 第19天:JUC中的Executor框架详解1,全面掌握java并发核心技术
这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介 ...
- JS 中获得根目录
/*** * 获得根目录 * @returns */ function getRootPath() { var strFullPath = window.document.location.href; ...