最近实现一个工具,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 = "::",

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 传入参数格式错误, 正确格式: ::")

}

}

/**

* JXLS Excel模板文件绝对路径

*/

@Option(name = "-t",

aliases = Array("-template"),

metaVar = "",

usage = "JXLS Excel模板文件绝对路径, 请参考:http://jxls.sourceforge.net/reference/simple_exporter.html。(File)" )

var template: File = null

/**

* Scala脚本文件

*/

@Option(name = "-s",

aliases = Array("-script"),

metaVar = "",

usage = "Scala脚本文件, 请参考:http://ammonite.io/#ScalaScripts。(String)")

var script: String = null

/**

* 输出Excel文件

*/

@Option(name = "-o",

aliases = Array("-output"),

/* required = true,handler = classOf[StringArrayOptionHandler],*/

metaVar = "",

usage = "输出Excel文件绝对路径。(File)")

var output: String = null

/**

* 输出Excel文件

*/

@Option(name = "-m",

aliases = Array("-mailto"),

metaVar = "",

usage = "生成报表发送邮箱,多个使用英文分号“;”分割。(String)")

var email: String = null

/**

* 邮件主题

*/

@Option(name = "-sub",

aliases = Array("-subject"),

metaVar = "",

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}")

}

}

原文:https://www.cnblogs.com/barrywxx/p/9976543.html

java main 参数解析_Java Main参数解析(Args4j)相关推荐

  1. java main 命令行_java Main 命令行

    CLI 即Command Line Interface,也就是"命令行接口",它为Java 程序访问和解析命令行参数提供了一种统一的接口. apache Commons CLI为用 ...

  2. java 三个点_Java,参数中的3个点

    是瓦拉格斯 :) varargs是可变长度参数的缩写,它允许方法接受可变数量的参数(0或更多).使用varargs,创建需要使用可变数量参数的方法变得非常简单.在Java 5中添加了变量参数的特性. ...

  3. Java参数变量_Java变量参数

    Java1.5添加新功能:可变参数:它适用于参数不确定性的数量,判断形势的类型.java变量参数数组操作. 特点: 1.今天的参数列表只能持续. 2.省略号(...)位于变量类型和变量名之间,前后有无 ...

  4. java main函数写法_java main()函数

    Java中的main()方法详解 在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方 ...

  5. java带参构造函数_Java 带参数的构造函数

    Java 带参数的构造函数 接下来,我们准备为大家介绍"带参数的构造函数". 那么,我们为什么要使用带有参数的构造函数呢? 首先,我们可以举一个例子,例如:在一个游戏里面,假设它有 ...

  6. linux java main 参数设置_Java虚拟机参数设置

    "MyEclipse has detected that less than 5% of the 64MB of Perm Gen (Non-heap memory) space remai ...

  7. java中对字符串进行解析_Java中字符串解析

    1.字符串不属于基本数据类型(基本数据类型有[byte,int,char,float,double,boolean,short,long]),字符串由单个或多个字符组成,本质上是字符数组,Java中提 ...

  8. java的无参构造函数_Java 无参数构造函数的应用

    创建类时指定了有参数构造函数后,系统默认不会创建无参数构造函数,需要自己手动创建. 创建子类的对象实例时,默认会先调用父类的无参数的构造函数(默认构造函数). 若父类未定义无参数构造函数,则在编译阶段 ...

  9. java xml dom4j 解析_Java使用DOM4J解析XML

    Dom4J方式解析XML文件.dom4j是非官方提供的xml文件解析方式,因此需要去第三方下载dom4j的jar包 File file = new File("D:\\chengmuzhe\ ...

  10. java jdbc 传参_java – 将参数传递给JDBC PreparedStatement

    我正在尝试为我的程序制作验证课程.我已经建立了与 MySQL数据库的连接,我已经在表中插入了行.该表由firstName,lastName和userID字段组成.现在我想通过构造函数的参数在数据库中选 ...

最新文章

  1. PyQt5+python3+pycharm开发环境配置
  2. [读书笔记]C#学习笔记三: C#类型详解..
  3. 烟袋斜街-后海,印象已模糊
  4. 苏老师首播3小时!超500人观看!录屏!源码!PPT……你要的都在这里!
  5. 用Hystrix保护您的应用程序
  6. 不同操作系统上屏蔽oracle的操作系统认证方式
  7. Linux超简单文本编辑器:nano
  8. 40Linux组41Linux所有者42Linux所在组43Linux修改所有组
  9. 现在小餐厅的推广视频
  10. CentOS7.3下部署Rsyslog+LogAnalyzer+MySQL中央日志服务器
  11. PDF超过6000页,OMG,学它
  12. SLAM无人车通过上摄像头扫描二维码重定位
  13. linux监测服务日志脚本,LINUX下的一个性能监测脚本
  14. QCC3008项目实战:BlueVest体感背心
  15. 【系统辨识】初识系统辨识,学习这个的目的
  16. oracle误删除数据之后的恢复方法
  17. LTE通信系统的网络拓扑结构(4G)
  18. android父布局的右侧,相对布局(RelativeLayout)的控件运用
  19. 计量经济学计算机第1章习题,计量经济学第1章习题.pdf
  20. 安装原生Win7-SP1系统

热门文章

  1. Mac 生成ico图标
  2. 黑科技网站推荐 第一弹 RemoveBg [一键抠图]
  3. 【不忘初心】Win10 20H2 19042.964_X64_四合一太阳谷图标_[纯净精简版][2.83G](2021.5.1)
  4. 爬虫豆瓣top250代码
  5. A N S I五个预定义的宏名
  6. FFmpeg无损转换ts为mp4
  7. LabVIEW编程LabVIEW开发1920 LCR仪表例程与相关资料
  8. android camera2美颜,Nano Camera(多功能美颜相机)V2.1 安卓版
  9. Python之温度换算
  10. 怎么提高,芝麻信用分到750