jar包执行时传参的使用姿势

虽说我们现在大多不太直接使用jar包运行方式,目前比较主流的是将自己的服务丢在某个容器中(如tomcat,jetty等)运行,比如我之前所属的电商公司,就是将项目打包为war包,丢到tomcat容器中运行的

在使用SpringBoot时,可能会出现直接打包一个可执行的jar,然后运行,这种时候,通过java命令执行时,时可以传参的,那么问题来了,main方法可以如何优雅的解析这些传参呢?

I. 简陋版本

最容易想到的,无非是自己直接解析main方法的传参,如我们知道的main方法的一般写法为

public static void main(String[] args) {
}

看到上面的写法,很容易就可以猜到,传入的参数最终都放到了args数组中,那么该怎么用就怎么用,一个hello world的实例如下

public static void main(String[] args) {
System.out.println("hello " + args[0]);
}

测试如下:

看到这里,真心感觉没有什么干货,上面这些过于小白了吧,估计连入门都算不上,那么参数处理仅止于此么?

II. 进阶版本

玩过shell的同学应该都知道man命令,可以用来查看很多shell命令的帮助,里面介绍了很多的shell命令的参数说明,而且这些参数一般有缩写和全拼,而且有些参数可以带传值,有些并不需要,可以说shell命令的传参方式,已经拥有自己独立的一套规范了,而且用起来非常的爽

那么我们的jar包,能否支持这种传参方式呢?

举一个简单的例子,上面的HelloWord接收一个简单用户名参数

  • 不传入时,默认输出 hello world
  • 短参方式: -n xxx
  • 长参方式: --name=xxx

仅仅支持这一个场景,需要自己来解析的话,就得写一长串的代码,好在这种需求已经有轮子了

1. commons-cli

首先引入依赖

<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.3.1</version>
</dependency>

开始使用,官网已经给出了例子,完整的doc可以参考

2. 实例演示

下面结合我的一个项目,给出实际的使用方式

@Slf4j
public class AppLaunch {
private static final String SOURCE_PATH = "./task-core/src/test/java/com/git/hui/task";
private static final String TASK_ARG_LONG = "task";
private static final String TASK_ARG_SHORT = "t";
private static final String ARG_HELP_LONG = "help";
private static final String ARG_HELP_SHORT = "h";
private static volatile boolean run = true; private static void printHelp() {
Options options = buildOptions();
HelpFormatter helpFormatter = new HelpFormatter();
helpFormatter.printHelp("java -jar ${jar} [options]", options);
} private static Options buildOptions() {
Options options = new Options();
options.addOption(
Option.builder(TASK_ARG_SHORT).argName(TASK_ARG_LONG).hasArg().longOpt(TASK_ARG_LONG).required(false)
.desc("choose task path, default [" + SOURCE_PATH + "]").build());
options.addOption(Option.builder(ARG_HELP_SHORT).longOpt(ARG_HELP_LONG).desc("show command help").build());
return options;
} private static CommandLine parseArguments(String[] arguments) {
Options options = buildOptions();
CommandLine commandLine = null;
try {
commandLine = new DefaultParser().parse(options, arguments);
} catch (ParseException e) {
e.printStackTrace();
System.exit(1);
} if (commandLine.hasOption(ARG_HELP_LONG)) {
printHelp();
System.exit(0);
}
return commandLine;
} public static void main(String[] args) throws InterruptedException {
CommandLine commandLine = parseArguments(args);
String scriptSource = commandLine.getOptionValue(TASK_ARG_LONG, SOURCE_PATH);
System.out.println("script source: {}" + scriptSource);
// ....
}
}

对上面的使用姿势进行简单的说明,从逻辑上划分,可以分为下面几块

  • 定义传参,包括参数说明,缩写和全拼,是否有参数值,描述等
  • 解析传参数组,将具体的传参解析为CommandLine对象
  • 获取参数,执行相应的业务逻辑

从源码角度来看,没什么复杂或者难以理解的地方,稍稍提一点,参数的定义,即buildOption方法中,上面指定了两个参数 help, task, 其中一个要求有参数值,一个不需要参数值,下面实际演示如下

III. 其他

0. 相关信息

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

180718-jar包执行传参使用小结的更多相关文章

  1. Apache Flink任意Jar包上传导致远程代码执行漏洞复现

    0x00 简介 Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎.Flink以数据并行和流水线方式执行任意流数据程序,Fl ...

  2. nexus的jar包上传与下载

    1. hosted,宿主仓库,部署自己的jar到这个类型的仓库,包括releases和snapshot两部分,Releases公司内部发布版本仓库. Snapshots 公司内部测试版本仓库 2. p ...

  3. nexus搭建maven私服及私服jar包上传和下载

    nexus搭建maven私服及私服jar包上传和下载 标签: nexus管理maven库snapshot 2017-06-28 13:02 844人阅读 评论(0) 收藏 举报 分类: Maven(1 ...

  4. IDEA如何将写好的java类(UDF函数)打成jar包上传linux

    一.编写一个UDF函数,实现将字符串大写转小写 import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; ...

  5. 构建自己的jar包上传至Mvaen中央仓库和版本更新

    构建自己的jar包上传至Mvaen中央仓库和版本更新 一直羡慕别人制造轮子,开源项目,供别人使用:我也想这样,可以自己才疏学浅,本次就将自己写小工具上传到Maven的中央仓库. 一步一步详细教程演示如 ...

  6. Apache Flink Dashboard未授权访问导致任意Jar包上传漏洞

    漏洞危害 攻击者无需Flink Dashboard认证,通过上传恶意jar包 csdn-[漏洞复现]Apache Flink任意Jar包上传导致远程代码执行 freebuf-Apache Flink ...

  7. Maven中安装本地Jar包到仓库中或将本地jar包上传

    摘要 maven install 本地jar 命令格式 mvn install:install-file -DgroupId=<group_name> -DartifactId=<a ...

  8. 用eclipse怎样将本地的项目打成jar包上传到maven仓库

    使用maven的项目中,有时需要把本地的项目打成jar包上传到mevan仓库. 操作如下: 前提:pom文件中配置好远程库的地址,否则会报错 1.将maven 中的settings文件配置好用户名和密 ...

  9. maven jar包上传到服务器

    maven jar包上传到服务器时出现pom文件没有上传上去,致使该jar包再被使用的时候没有依赖,jar包调用出错 解决办法,将pom文件一起deploy上去 mvn deploy:deploy-f ...

随机推荐

  1. java 静态相关内容

    一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码 ...

  2. windows下搭建nginx+php开发环境

    windows下搭建nginx+php开发环境 1.前言 windows下大多我们都是下载使用集成环境,但是本地已经存在一个集成环境,但不适合项目的需求.因此准备再自己搭建一个环境. 2.准备 工具: ...

  3. UVALive - 2515 (最小生成树 kruskal)

    You are assigned to design network connections between certain points in a wide area. You are given ...

  4. HDU 1004 Let the Balloon Rise(map的使用)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1004 Let the Balloon Rise Time Limit: 2000/1000 MS (J ...

  5. HDU 1162Eddy's picture(MST问题)

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  6. eclipse删除的文件如何恢复。

    1.如果不小心删除了单个文件或者文件夹. 鼠标点击上级目录 Ctrl+z就可以恢复了. 如果没有恢复,就右击项目,选择Resore from Local History 然后选择你所删除的文件,选择恢 ...

  7. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  8. iOS-截取TableView生成图片

    先看一下实例效果: 如果所示,这是一个在APP中截图,并调起微信客户端,发送给好友的例子,图片就是一个tableView的截图. 先实现一个小例子,如果tableVIew里面的内容,没有超过当前屏幕显 ...

  9. Python中模块

    模块 模块对我来说是什么 模块对我来说,感觉就像亲属或者朋友已经走过的路,他们已经趟过的浑水.掉过的坑.践行过的路线,全部提供给你,在你需要的时候请求帮助,借鉴他们的解决方法一样.都是为了方便走好人生 ...

  10. eclipse手动安装alibaba代码规范插件+取消阿里编码规约插件扫描出来的警告及错误

    如果你的开发环境无法访问外网,那么手动安装阿里巴巴的代码规范插件是一个不错的选择.另外,很多教程说该插件需要jdk1.8以上,我试了一下jdk1.7也是可以运行的,更低的版本就不知道了,貌似jdk1. ...