最近实现一个工具,Main函数会有很多参数,而且参数类型不同,为了统一解析,网上找到三方工具类Args4j,轻松搞定。

代码实例如下:

定义解析类:

  1. import java.io.File
  2.  
  3. import org.kohsuke.args4j.Option
  4. import org.slf4j.LoggerFactory
  5.  
  6. /**
  7. * 数据库报表生成命令行参数定义
  8. *
  9. * @author BarryWang create at 2018/6/23 20:21
  10. * @version 0.0.1
  11. */
  12. class ArgOptions {
  13. val logger= LoggerFactory.getLogger(classOf[ArgOptions])
  14.  
  15. /**
  16. * 对象名及查询SQL脚本对,中间用英文分号":"隔开
  17. */
  18. val query = new scala.collection.mutable.ListBuffer[(String, String, String)];
  19. @Option(name = "-q",
  20. aliases = Array("-query"),
  21. metaVar = "<db>:<objectName>:<sql>",
  22. usage = "对象名及查询SQL脚本对,中间用英文分号“:”隔开, 例如database:objectName:sql。(String)")
  23. def setProperty(property: String): Unit = {
  24. var arr = property.split(":")
  25. arr.length match {
  26. case 3 => query.+=((arr(0), arr(1), arr(2)))
  27. case _ => logger.info("-query 传入参数格式错误, 正确格式: <db>:<objectName>:<sql>")
  28. }
  29. }
  30.  
  31. /**
  32. * JXLS Excel模板文件绝对路径
  33. */
  34. @Option(name = "-t",
  35. aliases = Array("-template"),
  36. metaVar = "<template file>",
  37. usage = "JXLS Excel模板文件绝对路径, 请参考:http://jxls.sourceforge.net/reference/simple_exporter.html。(File)" )
  38. var template: File = null
  39.  
  40. /**
  41. * Scala脚本文件
  42. */
  43. @Option(name = "-s",
  44. aliases = Array("-script"),
  45. metaVar = "<scala script file path>",
  46. usage = "Scala脚本文件, 请参考:http://ammonite.io/#ScalaScripts。(String)")
  47. var script: String = null
  48.  
  49. /**
  50. * 输出Excel文件
  51. */
  52. @Option(name = "-o",
  53. aliases = Array("-output"),
  54. /* required = true,handler = classOf[StringArrayOptionHandler],*/
  55. metaVar = "<output excel file>",
  56. usage = "输出Excel文件绝对路径。(File)")
  57. var output: String = null
  58.  
  59. /**
  60. * 输出Excel文件
  61. */
  62. @Option(name = "-m",
  63. aliases = Array("-mailto"),
  64. metaVar = "<email>",
  65. usage = "生成报表发送邮箱,多个使用英文分号“;”分割。(String)")
  66. var email: String = null
  67.  
  68. /**
  69. * 邮件主题
  70. */
  71. @Option(name = "-sub",
  72. aliases = Array("-subject"),
  73. metaVar = "<subject>",
  74. usage = "邮件主题。(String)")
  75. var subject: String = null
  76. }
  1.  
  2. 引用解析类如下:
  1. import java.io.File
  2. import java.util.Date
  3.  
  4. import com.today.dbreport.action.impl.{GenReportByScriptAction, GenReportBySqlAction, GenReportByTemplateBySqlAction}
  5. import com.today.dbreport.dto.GenReportParam
  6. import com.today.dbreport.utils.EmailUtil
  7. import com.today.service.commons.util.DateTools
  8. import org.kohsuke.args4j.CmdLineParser
  9. import org.slf4j.LoggerFactory
  10.  
  11. import scala.collection.JavaConverters._
  12.  
  13. /**
  14. * 生成报表入口
  15. *
  16. * @author BarryWang create at 2018/6/1 11:02
  17. * @version 0.0.1
  18. */
  19. object Main {
  20. val logger= LoggerFactory.getLogger(Main.getClass)
  21.  
  22. def main(args: Array[String]): Unit = {
  23. val options = new ArgOptions
  24. val parser = new CmdLineParser(options)
  25. // print usage
  26. parser.printUsage(System.out)
  27. parser.parseArgument(args.toList.asJava)
  28.  
  29. //输出文件或发送邮件必填一个
  30. if(options.output == null && options.email == null){
  31. println("请传入参数-output 或 -mailto其中之一")
  32. return
  33. }
  34.  
  35. //生成报表地址
  36. var utf8Output = ""
  37. if (options.output != null) {
  38. utf8Output = new String(options.output.getBytes("UTF-8"), "UTF-8")
  39. } else {//本地临时文件
  40. val currentTime = DateTools.format(new Date(), "yyyyMMddHHmmssSSS")
  41. val outDir = s"${System.getProperty("user.dir")}${File.separator}output"
  42. var outputDir = new File(outDir)
  43. if(!outputDir.exists()){
  44. outputDir.mkdirs()
  45. }
  46. utf8Output = s"${outDir}${File.separator}${currentTime}.xlsx"
  47. }
  48. //带有Scala脚本
  49. if (options.script != null) {
  50. var templateOptional: Option[File] = None
  51. if (options.template != null) {
  52. templateOptional = Some(options.template)
  53. }
  54. val scriptOptional = Some(options.script)
  55. var mailtoOptional: Option[String] = None
  56. if (options.email != null) {
  57. mailtoOptional = Some(options.email)
  58. }
  59. val genReportParam = new GenReportParam(options.query, utf8Output, templateOptional, scriptOptional, mailtoOptional)
  60. //sql + script + jxls template
  61. //script + jxls tempalte
  62. new GenReportByScriptAction(genReportParam).execute
  63. } else {//无Scala脚本
  64. var templateOptional: Option[File] = None
  65. if (options.template != null){
  66. templateOptional = Some(options.template)
  67. }
  68. var scriptOptional : Option[String] = None
  69. if(options.script != null){
  70. scriptOptional = Some(options.script)
  71. }
  72.  
  73. var mailtoOptional: Option[String] = None
  74. if (options.email != null){
  75. mailtoOptional = Some(options.email)
  76. }
  77.  
  78. val genReportParam = new GenReportParam(options.query, utf8Output, templateOptional, scriptOptional, mailtoOptional)
  79. if (options.template != null) { //sql* + jxls template
  80. new GenReportByTemplateBySqlAction(genReportParam).execute
  81. } else { //no template + sql
  82. new GenReportBySqlAction(genReportParam).execute
  83. }
  84. }
  85.  
  86. println(s"报表生成成功${utf8Output}!")
  87. //发送邮件
  88. if (options.email != null) {
  89. var subject = "报表工具生成报表"
  90. if(options.subject != null){
  91. subject = options.subject
  92. }
  93. EmailUtil.sendEmail(options.email.trim, subject, "生成报表请参考附件", utf8Output)
  94. println("邮件发送成功,请邮件附件下载相关报表!")
  95. //邮件发送成功, 删除本地临时文件
  96. if (options.output == null) {
  97. new File(utf8Output).deleteOnExit()
  98. }
  99. }
  100. logger.info(s"报表生成成功${utf8Output}")
  101. }
  102. }
  1.  
  1. 运行main函数会展示如下提示:
  1. -f (-from) <from> : 邮件发送者。(String)
  2. -m (-mailto) <email> : 生成报表发送邮箱,多个使用英文分号“;”分割。(String)
  3. -o (-output) <output excel file> : 输出Excel文件绝对路径。(File)
  4. -q (-query) <db>:<objectName>:<sql> : 对象名及查询SQL脚本对,中间用英文分号“:”隔开,
  5. 例如database:objectName:sql。(String
  6. -s (-script) <scala script file path> : Scala脚本文件, 请参考:http://ammonite.io/#Scal
  7. aScripts。(String)
  8. -sub (-subject) <subject> : 邮件主题。(String)
  9. -t (-template) <template file> : JXLS Excel模板文件绝对路径, 请参考:http://jxls.sou
  10. rceforge.net/reference/simple_exporter.
  11. html。(File)
  12. 请传入参数-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. 一个比ack速度快n倍的代码搜索工具: ag

    一个比ack速度快n倍的代码搜索工具:  ag 银搜索者(The Silver Searcher) 一个类似于代码搜索工具ack,着重于速度. Github:   https://github.com ...

  2. 1.Spring Framework 5.0 入门篇

    1.为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring  在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spri ...

  3. 第九章——运行tensorflow(Up and Running with TensorFlow)

    本章简单介绍了TensorFlow的安装以及使用.一些细节需要在后续的应用中慢慢把握. TensorFlow并不仅仅局限于神经网络和机器学习,它甚至可以用于量子物理仿真. TensorFlow的优势: ...

  4. 关于数据库报Packet for query is too large (1986748 > 1048576)(mysql写入数据过大)的解决办法

    方法2 (很妥协,很纠结的办法) 进入mysql server 在mysql 命令行中运行 set global max_allowed_packet = 2*1024*1024*10 然后关闭掉这此 ...

  5. tkinter中frame布局控件(九)

    frame控件 frame控件是将窗口分成好几个小模块,然后每个小模块中添加控件. 也就是将窗口合理的布局 由于和其他控件的操作基本一致,就不做注释了 import tkinter wuya = tk ...

  6. 纯CSS小三角制作

    无关的知识点 ① background-clip 属性规定背景的绘制区域. 1.padding-box:从padding区域(不含padding)开始向外裁剪背景. 2.border-box:从bor ...

  7. jQuery学习之旅 Item1 选择器【一】

    点击"名称"会跳转到此方法的jQuery官方说明文档. 1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择I ...

  8. Eclipse 4.2 安装Java反编译插件

    在eclipse下安装反编译插件可以直接查看 .class 文件对应的java源码. 反编译插件有 jdeclipse 和 jadeclipse. (1) jdeclipse http://www.d ...

  9. 玩转web之ligerui(二)---前缀编码生成树(分级码)实现树型表格

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 背景:             在ligerui中(其他uI可能也大同小异),实现树形表格可以通过父子节点,也可以通过前缀编码生成树去实现,而使 ...

  10. Effective Java 第三版——43.方法引用优于lambda表达式

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...