命令行通过入参调用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

原文地址:https://www.cnblogs.com/cone/p/11441251.html

时间: 2024-10-28 18:55:12

命令行通过入参调用jar包的相关文章

java命令行执行程序解决依赖外部jar包的问题

用java命令行直接执行程序,如果这个程序需要引用外部jar包.就不能单纯用java xx来执行 如果你的jar包和程序就在一个目录: 编译 javac -cp D:\yy\yy.jar,D\xx\xx.jar test.java 执行 java -cp D:\yy\yy.jar,D\xx\xx.jar test 但是往往我们依赖的包很多,要一个个填写估计就疯了.所有我们一般会把所有的外部依赖包都放在一个文件夹里,比如在D:\lib 编译 javac -Djava.ext.dirs=D:\lib

java命令行编译和运行引用jar包的文件

经常遇到需要添加第三方jar文件的情况.在命令行状态下要加载外部的jar文件非常麻烦,很不好搞,在网上折腾了很久终于搞定了,在这里做个笔记: 1.编译:javac -Djava.ext.dirs=./lib Test.java 2.运行:java -Djava.ext.dirs=./lib Test ./lib是指存放第三方jar文件的目录.也可以写成绝对路径:/**/lib (试过了可以!)Test.java指包含main函数的类.

nodejs 命令行获取入参

安装:npm install yargs --save-dev Example index.js const argv = yargs.alias('n', 'name').alias('p', 'port').alias('t', 'tpl').argv console.log(argv.name); 命令行输入: $ node index.js -n fuck -p 8080 -tpl components 原文地址:https://www.cnblogs.com/CyLee/p/84344

java命令行从编译到打jar包到执行

整个过程模拟Eclipse的Java Project项目,包括src,以及生成的.class文件在bin中,还可能有lib,包含额外的jar包. 一. javac编译 1. 没有额外的jar包 1)准备工作 我们新建JavaProject,该项目结构如下: bin:必须新建一个空的bin文件,用于存放生成.class文件 src:源码文件,包含我们写的.java文件 src/com/zc/javaproject/test/HelloJava.java src/com/zc/javaproject

如何制作Jar包并在android中调用jar包

android制作jar包: 新建android工程,然后右击,点击导出,选择导出类型为Java下的JAR file,在java file specification 中不要选择androidmanifest.xml和res文件夹,就可以了.否则在调用jar包的时候会出现“Error generating final archive: Found duplicate file for APK: AndroidManifes”这个错误. 如果在android用调用jar包,需要在工程的属性的Jav

命令行执行python模块时提示包找不到的问题

庄稼人不是专职python开发的道友,虽然与python相识已多年,可惜相识不相知,只是偶尔借助pydev写一些简单的小工具. 多年来,一直困惑于这样一个问题:同样的工程,同样的代码,使用pydev可以运行任意一个python脚本,而使用命令行运行却不行?命令行下(或者双击执行)总是提示"ImportError: No module named xxx"?pydev究竟做了什么魔术呢? 长话短说,以上面工程为例,如果是在命令行中直接执行 python c.py , 都会提示"

tcpdump教程 - 从命令行抓取和分析数据包

前言 在介绍和使用tcpdump之前,请确保您已经掌握或者了解如下几个关键概念,否则后面的内容让你有点痛苦. 能够在Linux命令行下工作 理解OSI七层网络协议的概念 熟悉各层的协议头部,重点是IP/TCP/UDP 交换机和路由器对应于OSI的协议层 另外还需要注意的是: tcpdump是基于Unix系统的命令行式的数据包嗅探工具.如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给

11.Cocos2dx2.2下使用JNI技术调用jar包里面的一些方法遇到的一些问题及解决方案。

<span style="font-family: Arial, Helvetica, sans-serif;">步骤一:导入JniHelper.h头文件.</span> #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) #include "JniHelper.h" #endif: 此时会遇到JniHelper.h头文件无法找到的问题,需要添加附加包含目录即可解决问题.具体操作步骤如下:右击项目-

Loadrunner11.0调用Jar包

又好几天不写东西了,是不是意味着最近没有大的进步,时时敲打自己. 今天把loadrunner如何调用Jar包搞定了,现在把配置的过程中需要注意的东西写下来,分享给小伙伴儿,减少他们在前行路上的弯路. 声明:我只对以下环境负责,因为稳定的测试环境对于一个测试人员来说,是非常重要的,所以,我轻易不会用最新东西,因为有太多的兼容性的东西,需要大家扒拉扒拉的去弄. 我使用的是:Loadrunner11.0,Jdk1.6 1.设置Java开发环境: 在操作系统上设置:JAVA_HOME,CLASSPATH