Java Main参数解析(Args4j)
最近实现一个工具,Main函数会有很多参数,而且参数类型不同,为了统一解析,网上找到三方工具类Args4j,轻松搞定。
代码实例如下:
定义解析类:
- import java.io.File
- import org.kohsuke.args4j.Option
- import org.slf4j.LoggerFactory
- /**
- * 数据库报表生成命令行参数定义
- *
- * @author BarryWang create at 2018/6/23 20:21
- * @version 0.0.1
- */
- class ArgOptions {
- val logger= LoggerFactory.getLogger(classOf[ArgOptions])
- /**
- * 对象名及查询SQL脚本对,中间用英文分号":"隔开
- */
- val query = new scala.collection.mutable.ListBuffer[(String, String, String)];
- @Option(name = "-q",
- aliases = Array("-query"),
- metaVar = "<db>:<objectName>:<sql>",
- usage = "对象名及查询SQL脚本对,中间用英文分号“:”隔开, 例如database:objectName:sql。(String)")
- def setProperty(property: String): Unit = {
- var arr = property.split(":")
- arr.length match {
- case 3 => query.+=((arr(0), arr(1), arr(2)))
- case _ => logger.info("-query 传入参数格式错误, 正确格式: <db>:<objectName>:<sql>")
- }
- }
- /**
- * JXLS Excel模板文件绝对路径
- */
- @Option(name = "-t",
- aliases = Array("-template"),
- metaVar = "<template file>",
- usage = "JXLS Excel模板文件绝对路径, 请参考:http://jxls.sourceforge.net/reference/simple_exporter.html。(File)" )
- var template: File = null
- /**
- * Scala脚本文件
- */
- @Option(name = "-s",
- aliases = Array("-script"),
- metaVar = "<scala script file path>",
- usage = "Scala脚本文件, 请参考:http://ammonite.io/#ScalaScripts。(String)")
- var script: String = null
- /**
- * 输出Excel文件
- */
- @Option(name = "-o",
- aliases = Array("-output"),
- /* required = true,handler = classOf[StringArrayOptionHandler],*/
- metaVar = "<output excel file>",
- usage = "输出Excel文件绝对路径。(File)")
- var output: String = null
- /**
- * 输出Excel文件
- */
- @Option(name = "-m",
- aliases = Array("-mailto"),
- metaVar = "<email>",
- usage = "生成报表发送邮箱,多个使用英文分号“;”分割。(String)")
- var email: String = null
- /**
- * 邮件主题
- */
- @Option(name = "-sub",
- aliases = Array("-subject"),
- metaVar = "<subject>",
- usage = "邮件主题。(String)")
- var subject: String = null
- }
- 引用解析类如下:
- import java.io.File
- import java.util.Date
- import com.today.dbreport.action.impl.{GenReportByScriptAction, GenReportBySqlAction, GenReportByTemplateBySqlAction}
- import com.today.dbreport.dto.GenReportParam
- import com.today.dbreport.utils.EmailUtil
- import com.today.service.commons.util.DateTools
- import org.kohsuke.args4j.CmdLineParser
- import org.slf4j.LoggerFactory
- import scala.collection.JavaConverters._
- /**
- * 生成报表入口
- *
- * @author BarryWang create at 2018/6/1 11:02
- * @version 0.0.1
- */
- object Main {
- val logger= LoggerFactory.getLogger(Main.getClass)
- def main(args: Array[String]): Unit = {
- val options = new ArgOptions
- val parser = new CmdLineParser(options)
- // print usage
- parser.printUsage(System.out)
- parser.parseArgument(args.toList.asJava)
- //输出文件或发送邮件必填一个
- if(options.output == null && options.email == null){
- println("请传入参数-output 或 -mailto其中之一")
- return
- }
- //生成报表地址
- var utf8Output = ""
- if (options.output != null) {
- utf8Output = new String(options.output.getBytes("UTF-8"), "UTF-8")
- } else {//本地临时文件
- val currentTime = DateTools.format(new Date(), "yyyyMMddHHmmssSSS")
- val outDir = s"${System.getProperty("user.dir")}${File.separator}output"
- var outputDir = new File(outDir)
- if(!outputDir.exists()){
- outputDir.mkdirs()
- }
- utf8Output = s"${outDir}${File.separator}${currentTime}.xlsx"
- }
- //带有Scala脚本
- if (options.script != null) {
- var templateOptional: Option[File] = None
- if (options.template != null) {
- templateOptional = Some(options.template)
- }
- val scriptOptional = Some(options.script)
- var mailtoOptional: Option[String] = None
- if (options.email != null) {
- mailtoOptional = Some(options.email)
- }
- val genReportParam = new GenReportParam(options.query, utf8Output, templateOptional, scriptOptional, mailtoOptional)
- //sql + script + jxls template
- //script + jxls tempalte
- new GenReportByScriptAction(genReportParam).execute
- } else {//无Scala脚本
- var templateOptional: Option[File] = None
- if (options.template != null){
- templateOptional = Some(options.template)
- }
- var scriptOptional : Option[String] = None
- if(options.script != null){
- scriptOptional = Some(options.script)
- }
- var mailtoOptional: Option[String] = None
- if (options.email != null){
- mailtoOptional = Some(options.email)
- }
- val genReportParam = new GenReportParam(options.query, utf8Output, templateOptional, scriptOptional, mailtoOptional)
- if (options.template != null) { //sql* + jxls template
- new GenReportByTemplateBySqlAction(genReportParam).execute
- } else { //no template + sql
- new GenReportBySqlAction(genReportParam).execute
- }
- }
- println(s"报表生成成功${utf8Output}!")
- //发送邮件
- if (options.email != null) {
- var subject = "报表工具生成报表"
- if(options.subject != null){
- subject = options.subject
- }
- EmailUtil.sendEmail(options.email.trim, subject, "生成报表请参考附件", utf8Output)
- println("邮件发送成功,请邮件附件下载相关报表!")
- //邮件发送成功, 删除本地临时文件
- if (options.output == null) {
- new File(utf8Output).deleteOnExit()
- }
- }
- logger.info(s"报表生成成功${utf8Output}")
- }
- }
- 运行main函数会展示如下提示:
- -f (-from) <from> : 邮件发送者。(String)
- -m (-mailto) <email> : 生成报表发送邮箱,多个使用英文分号“;”分割。(String)
- -o (-output) <output excel file> : 输出Excel文件绝对路径。(File)
- -q (-query) <db>:<objectName>:<sql> : 对象名及查询SQL脚本对,中间用英文分号“:”隔开,
- 例如database:objectName:sql。(String)
- -s (-script) <scala script file path> : Scala脚本文件, 请参考:http://ammonite.io/#Scal
- aScripts。(String)
- -sub (-subject) <subject> : 邮件主题。(String)
- -t (-template) <template file> : JXLS Excel模板文件绝对路径, 请参考:http://jxls.sou
- rceforge.net/reference/simple_exporter.
- html。(File)
- 请传入参数-output 或 -mailto其中之一
是不是就看起来很直观了!
Java Main参数解析(Args4j)的更多相关文章
- 打印Java main参数
public class Main { public static void main(String args[]){ System.out.println("打印main方法中的输入参数, ...
- java笔试之参数解析(正则匹配)
在命令行输入如下命令: xcopy /s c:\ d:\, 各个参数如下: 参数1:命令字xcopy 参数2:字符串/s 参数3:字符串c:\ 参数4: 字符串d:\ 请编写一个参数解析程序,实现将命 ...
- java 获取url及url参数解析
java 获取url及url参数解析 一.url编码:URLEncoder.encode(userName); 二.url解码: URLDecoder.decode(userName);
- Java注解全面解析(转)
1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(三)——JVM篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(四)——版本特性篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- 【转载】Java类加载原理解析
Java类加载原理解析 原文出处:http://www.blogjava.net/zhuxing/archive/2008/08/08/220841.html 1 基本信息 摘要: 每个j ...
- SpringBoot系列教程web篇之如何自定义参数解析器
title: 190831-SpringBoot系列教程web篇之如何自定义参数解析器 banner: /spring-blog/imgs/190831/logo.jpg tags: 请求参数 cat ...
随机推荐
- 一个比ack速度快n倍的代码搜索工具: ag
一个比ack速度快n倍的代码搜索工具: ag 银搜索者(The Silver Searcher) 一个类似于代码搜索工具ack,着重于速度. Github: https://github.com ...
- 1.Spring Framework 5.0 入门篇
1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring 在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...
- 第九章——运行tensorflow(Up and Running with TensorFlow)
本章简单介绍了TensorFlow的安装以及使用.一些细节需要在后续的应用中慢慢把握. TensorFlow并不仅仅局限于神经网络和机器学习,它甚至可以用于量子物理仿真. TensorFlow的优势: ...
- 关于数据库报Packet for query is too large (1986748 > 1048576)(mysql写入数据过大)的解决办法
方法2 (很妥协,很纠结的办法) 进入mysql server 在mysql 命令行中运行 set global max_allowed_packet = 2*1024*1024*10 然后关闭掉这此 ...
- tkinter中frame布局控件(九)
frame控件 frame控件是将窗口分成好几个小模块,然后每个小模块中添加控件. 也就是将窗口合理的布局 由于和其他控件的操作基本一致,就不做注释了 import tkinter wuya = tk ...
- 纯CSS小三角制作
无关的知识点 ① background-clip 属性规定背景的绘制区域. 1.padding-box:从padding区域(不含padding)开始向外裁剪背景. 2.border-box:从bor ...
- jQuery学习之旅 Item1 选择器【一】
点击"名称"会跳转到此方法的jQuery官方说明文档. 1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择I ...
- Eclipse 4.2 安装Java反编译插件
在eclipse下安装反编译插件可以直接查看 .class 文件对应的java源码. 反编译插件有 jdeclipse 和 jadeclipse. (1) jdeclipse http://www.d ...
- 玩转web之ligerui(二)---前缀编码生成树(分级码)实现树型表格
请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 背景: 在ligerui中(其他uI可能也大同小异),实现树形表格可以通过父子节点,也可以通过前缀编码生成树去实现,而使 ...
- Effective Java 第三版——43.方法引用优于lambda表达式
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...