Picocli 2.0增加了对其他JVM语言(尤其是Groovy)的支持。 当Groovy语言具有CliBuilder类的内置CLI支持时,为什么要使用picocli?

您可能会喜欢picocli的使用帮助,默认情况下会显示ANSI 颜色和样式 。 您可能喜欢的另一个功能是命令行TAB自动补全 。 最后,还有很多较小的功能,例如您的脚本需要零行的命令行解析代码,picocli的子命令支持,选项和位置参数的类型转换以及解析器跟踪等。

让我们看一个例子。 下面的checksum.groovy脚本采用一个或多个文件参数,并为每个文件打印出一个校验和和文件名。 默认情况下,“校验和”算法为MD5,但用户可以指定其他MessageDigest算法。 用户可以使用-h--help选项来请求使用帮助。

@Grab('info.picocli:picocli:2.0.3')
@picocli.groovy.PicocliScript
import groovy.transform.Field
import java.security.MessageDigest
import static picocli.CommandLine.*@Parameters(arity="1", paramLabel="FILE", description="The file(s) whose checksum to calculate.")
@Field File[] files@Option(names = ["-a", "--algorithm"], description = ["MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512,","  or any other MessageDigest algorithm."])
@Field String algorithm = "MD5"@Option(names= ["-h", "--help"], usageHelp= true, description= "Show this help message and exit.")
@Field boolean helpRequestedfiles.each {println MessageDigest.getInstance(algorithm).digest(it.bytes).encodeHex().toString() + "\t" + it
}

$picocli-home/examples/src/main/groovy/picocli/examples目录中运行时,此示例脚本将产生以下结果:

$ groovy checksum.groovy *.*
4995d24bbb3adf67e2120c36dd3027b7        checksum.groovy
a03c852de017f9303fcc373c7adafac6        checksum-with-banner.groovy
1ee567193bf41cc835ce76b6ca29ed30        checksum-without-base.groovy

使用-h--help选项调用脚本将显示以下ANSI颜色和样式的用法帮助消息:

代码在哪里?

您可能已经注意到,上面的脚本不包含任何用于解析命令行参数或处理使用帮助请求的逻辑。

没有@picocli.groovy.PicocliScript批注,脚本代码将如下所示:

class Checksum {@Parameters(arity = "1", paramLabel = "FILE", description = "...")File[] files@Option(names = ["-a", "--algorithm"], description = ["..."])String algorithm = "MD5"@Option(names = ["-h", "--help"], usageHelp = true, description = "...")boolean helpRequested
}
Checksum checksum = new Checksum()
CommandLine commandLine = new CommandLine(checksum)
try {commandLine.parse(args)if (commandLine.usageHelpRequested) {commandLine.usage(System.out)} else {checksum.files.each {byte[] digest = MessageDigest.getInstance(checksum.algorithm).digest(it.bytes)println digest.encodeHex().toString() + "\t" + it}}
} catch (ParameterException ex) {println ex.messagecommandLine.usage(System.out)
}

上面的示例包含用于解析命令行,处理无效用户输入以及检查使用帮助请求的显式代码。 该脚本的第一个版本没有任何此样板代码。

让我们看一下它是如何工作的。

底标

@picocli.groovy.PicocliScript注释的脚本会自动转换为使用picocli.groovy.PicocliBaseScript作为其基类。 这会将Groovy脚本变成基于picocli的命令行应用程序。

运行脚本时,Groovy会调用脚本的run方法。 PicocliBaseScript::run方法负责解析命令行并使用结​​果填充脚本字段。 run方法执行以下操作:

  • 首先,以@Option@Parameters注释的@Field变量是从命令行参数初始化的。
  • 如果用户输入无效,则会打印一条错误消息,然后显示用法帮助消息。
  • 如果用户请求使用帮助或版本信息,则将其打印到控制台并退出脚本。
  • 否则,将执行脚本主体。

可以自定义此行为,有关更多详细信息,请参见PicocliBaseScript javadoc 。

除了更改脚本基类, @PicocliScript批注还允许Groovy脚本直接使用@Command批注,而无需引入帮助程序类。 picocli解析器将在包含@Option@Parameters注释字段的类中寻找此注释。 更改脚本基类的同一自定义AST转换还将脚本中的任何@Command注释都移动到此转换后的类,以便picocli解析器可以将其拾取。

颜色的使用帮助

@Command注释使您可以自定义用法帮助消息的各个部分,例如命令名称,描述,页眉,页脚等。

让我们在示例脚本中添加一些麻烦。 (对于ASCII Art Generator,请登录http://patorjk.com/software/taag/ 。)

@Grab('info.picocli:picocli:2.0.3')
@Command(header = [$/@|bold,green    ___                            ___ _           _                  |@/$,$/@|bold,green   / __|_ _ ___  _____ ___  _     / __| |_  ___ __| |__ ____  _ _ __  |@/$,$/@|bold,green  | (_ | '_/ _ \/ _ \ V / || |   | (__| ' \/ -_) _| / /(_-< || | '  \ |@/$,$/@|bold,green   \___|_| \___/\___/\_/ \_, |    \___|_||_\___\__|_\_\/__/\_,_|_|_|_||@/$,$/@|bold,green                         |__/                                         |@/$],description = "Print a checksum of each specified FILE.",version = 'checksum v1.2.3', showDefaultValues = true,footerHeading = "%nFor more details, see:%n",footer = ["[1] https://docs.oracle.com/javase/9/docs/specs/security/standard-names.html","ASCII Art thanks to http://patorjk.com/software/taag/"]
)
@picocli.groovy.PicocliScript
import groovy.transform.Field
import java.security.MessageDigest
import static picocli.CommandLine.*@Parameters(arity="1", paramLabel="FILE", description="The file(s) whose checksum to calculate.")
@Field private File[] files@Option(names = ["-a", "--algorithm"], description = ["MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512, or","  any other MessageDigest algorithm. See [1] for more details."])
@Field private String algorithm = "MD5"@Option(names= ["-h", "--help"], usageHelp=true, description="Show this help message and exit.")
@Field private boolean helpRequested@Option(names= ["-V", "--version"], versionHelp=true, description="Show version info and exit.")
@Field private boolean versionInfoRequestedfiles.each {println MessageDigest.getInstance(algorithm).digest(it.bytes).encodeHex().toString() + "\t" + it
}

脚本的新版本添加了页眉和页脚,以及打印版本信息的功能。 使用帮助消息和版本信息中显示的所有文本都可能包含格式说明符,例如%n行分隔符。

使用帮助消息还可以显示ANSI颜色和样式。 Picocli支持简单的标记语法,其中@| 开始一个ANSI样式的节, |@结束它。 立即跟随@| 是用逗号分隔的颜色和样式列表,例如@|STYLE1[,STYLE2]…​ text|@ 。 有关可用颜色和样式的详细信息,请参见picocli 用户手册 。

新脚本的用法帮助消息如下所示:

@Command批注还具有version = "checksum v1.2.3"属性。 当用户指定该版本字符串印刷--version在命令行上,因为我们声明的@Option带属性,该属性名称versionHelp = true

$ groovy checksum-with-banner.groovy --version
checksum v1.2.3

有关更多详细信息,请参见用户手册的“ 版本帮助”部分。

结论

@PicocliScript批注允许Groovy脚本省略样板代码,同时添加强大的通用命令行应用程序功能。 在示例脚本的最终版本中,大多数代码实际上是使用帮助消息的描述文本。

picocli还有很多其他功能,请尝试一下!

如果愿意,请在GitHub上为项目加注星标,然后告诉您的朋友!

翻译自: https://www.javacodegeeks.com/2018/01/picocli-2-0-groovy-scripts-steroids.html

Picocli 2.0:类固醇上的Groovy脚本相关推荐

  1. groovy.run 脚本_Picocli 2.0:类固醇上的Groovy脚本

    groovy.run 脚本 Picocli 2.0增加了对其他JVM语言(尤其是Groovy)的支持. 当Groovy语言具有CliBuilder类的内置CLI支持时,为什么还要使用picocli? ...

  2. 【Groovy】Groovy 脚本调用 ( Groovy 脚本编译 | Groovy 脚本字节码文件分析 )

    文章目录 一.Groovy 脚本编译 二.Groovy 脚本字节码文件分析 一.Groovy 脚本编译 Groovy 脚本编译后的字节码文件是一个继承 Script 的类 ; 编译下面的 Script ...

  3. ElasticSearch Groovy脚本远程代码执行漏洞

    什么是ElasticSearch? 它是一种分布式的.实时性的.由JAVA开发的搜索和分析引擎. 2014年,曾经被曝出过一个远程代码执行漏洞(CVE-2014-3120),漏洞出现在脚本查询模块,由 ...

  4. IDEA不愧为神器,结合Groovy脚本,简直无敌!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 人间哪有四月天 来源 | segmentfau ...

  5. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 绑定作用域 binding 变量分析 | Binding 类 variables 成员分析 )

    文章目录 一.绑定作用域 binding 变量分析 二.Binding 类 variables 成员分析 三.完整代码示例 1.调用者 Groovy 脚本 2.被调用者 Groovy 脚本 3.执行结 ...

  6. 【Groovy】Groovy 脚本调用 ( Groovy 脚本中调用另外一个 Groovy 脚本 | 调用 evaluate 方法执行 Groovy 脚本 | 参数传递 )

    文章目录 一.Groovy 脚本中调用另外一个 Groovy 脚本 1.调用 evaluate 方法执行 Groovy 脚本 2.参数传递 二.完整代码示例 1.调用者 Groovy 脚本 2.被调用 ...

  7. java groovy jar包_如何将jar包包含在groovy脚本中?

    如果你真的需要,你也可以在运行时加载一个JAR: this.getClass().classLoader.rootLoader.addURL(new File("file.jar" ...

  8. groovy定义变量获取当前时间_IDEA不愧为神器,结合Groovy脚本,简直无敌!

    作者:人间哪有四月天 segmentfault.com/a/1190000020189801 导语 如今,有许许多多的插件或者编辑器都支持根据数据表自动生成数据实体类了, 比如IDEA, 各种MyBa ...

  9. Picocli 2.0:事半功倍

    介绍 Picocli是一个单文件命令行解析框架,它使您几乎不需要任何代码即可创建命令行应用程序. 使用@Option或@Parameters注释应用程序中的字段,picocli将分别使用命令行选项和位 ...

最新文章

  1. 为什么枚举类优于纯枚举?
  2. 如何让弹窗不影响主界面_如何压缩视频大小不影响画质
  3. vCenter的安装与部署
  4. C++突破private的方案
  5. ssl2124-涂色【离散化】
  6. Mybatis insert操作细节【ID】
  7. 解决 java.lang.IllegalArgumentException: Repository interface must not be null on initialization!
  8. 肖仰华 | 知识图谱研究的回顾与展望
  9. Spark NaiveBayes Demo 朴素贝叶斯分类算法
  10. 解决win7检测不到第二个显示器的方法
  11. javascript闭包小结
  12. CSS控制显示超出部分,用省略号显示
  13. ie型lfsr_线性反馈移位寄存器原理与实现 - 全文
  14. sql 替换字段中的部分字符,替换指定字符
  15. Swiper、vue-awesome-swiper中文文档
  16. 电子计算机扫描仪系统,人体三维扫描仪
  17. 微信小程序前四周内容总结
  18. 怎么解决 接口请求 504 Gateway Time-out
  19. Telegraf 简单使用介绍
  20. 软件开发人员的作战手册 - 让程序员活的久一点

热门文章

  1. Spring Boot API 接口文档 Swagger 入门
  2. 图解elasticsearch原理转载自
  3. 跟我学 Java 8 新特性之 Stream 流基础体验
  4. Oracle入门(八)之权限
  5. ElasticJob-分布式作业调度神器,你们还在用Quartz吗
  6. 图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross)
  7. C++描述杭电OJ 2005.第几天? ||
  8. 配置环境变量 path
  9. SQL注入问题及预防方法
  10. 计算机视觉论文doc,嘉炬-计算机视觉论文资料.doc