最近实现一个工具,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)的更多相关文章

  1. 打印Java main参数

    public class Main { public static void main(String args[]){ System.out.println("打印main方法中的输入参数, ...

  2. java笔试之参数解析(正则匹配)

    在命令行输入如下命令: xcopy /s c:\ d:\, 各个参数如下: 参数1:命令字xcopy 参数2:字符串/s 参数3:字符串c:\ 参数4: 字符串d:\ 请编写一个参数解析程序,实现将命 ...

  3. java 获取url及url参数解析

    java  获取url及url参数解析 一.url编码:URLEncoder.encode(userName); 二.url解码: URLDecoder.decode(userName);

  4. Java注解全面解析(转)

    1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...

  5. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. Java 面试知识点解析(三)——JVM篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. 【转载】Java类加载原理解析

    Java类加载原理解析 原文出处:http://www.blogjava.net/zhuxing/archive/2008/08/08/220841.html 1       基本信息 摘要: 每个j ...

  9. SpringBoot系列教程web篇之如何自定义参数解析器

    title: 190831-SpringBoot系列教程web篇之如何自定义参数解析器 banner: /spring-blog/imgs/190831/logo.jpg tags: 请求参数 cat ...

随机推荐

  1. Libevent教程001: 简介与配置

    本文内容大致翻译自 libevent-book, 但不是照本翻译. 成文时, libevent最新的稳定版为 2.1.8 stable. 即本文如无特殊说明, 所有描述均以 2.1.8 stable ...

  2. Markdown 编辑器语法 专题

    基本技巧 代码 如果你只想高亮语句中的某个函数名或关键字,可以使用 `function_name()` 实现 通常编辑器根据代码片段适配合适的高亮方法,但你也可以用 ```(tab键上的符号,要从每行 ...

  3. Enabling Chrome Developer Tools inside Postman

    Chrome's Developer Tools are an indispensable part of the modern web development workflow. However, ...

  4. Python Redis 的安装

    安装 可以去pypi上找到redis的Python模块: http://pypi.python.org/pypi?%3Aaction=search&term=redis&submit= ...

  5. hibernate关系映射

    多对一:比如多个订单对应同一个用户,需要在订单表中添加一个用户的属性 订单类: private Integer orderId; private Date createTime; private Us ...

  6. IE下获取XPATH小工具,支持32/64位

    背景是曾经友情支持了测试组一小段时间,发现他们使用selenium做页面的自动化测试,需要用到XPath,但IE下没有获取XPath的工具,只能在Firefox和chrome下获取,步骤还比较麻烦.而 ...

  7. authorizations.go

    {         return nil, fmt.Errorf("invalid TTL %d (must be >0)", authState.TTL)     }    ...

  8. bzoj5250 [2018多省省队联测]秘密袭击

    博主蒟蒻,目前还不会动态dp,所以下面说的是一个并不优秀的暴力,我会补的! 我们考虑按权值从大到小依次点亮每个点,相同权值可以同时点亮,每次点亮后,我们进行一次树形背包. 处理出$f[i][j]$表示 ...

  9. python 备份文件脚本

    使用python备份服务器的文件 #coding=utf- import os import os.path def copyFiles(sourceDir, targetDir): for file ...

  10. PCB设计检查

    一.资料输入阶段1.在流程上接收到的资料是否齐全(包括:原理图.*.brd文件.料单.PCB设计说明以及PCB设计或更改要求.标准化要求说明.工艺设计说明文件)2.确认PCB模板是最新的3. 确认模板 ...