Picocli 2.0:类固醇上的Groovy脚本

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

angular字符串转成html,详解angular如何调用HTML字符串的方法

详解angular如何调用HTML字符串的方法前面的文章我们介绍过angular6.0的数据绑定&#xff0c;也就是前面页面如何调用后台的数据&#xff0c;我们接触到了调用普通数据——如&#xff1a;调用产品详情{{post.content}}。在使用中&#xff0c;我们会发现&#xff0c;如果按原来的…

西南交大计算机几个专业,西南交通大学计算机科学与技术专业

西南交通大学计算机科学与技术专业计算机科学与技术专业解读计算机科学与技术专业我校早在60年代初就创办了计算机技术专业&#xff0c;是全国较早设立该专业的高等学校之一。1978年由中科院院士曹建猷教授等主持恢复开办计算机科学及应用专业&#xff0c;1981年在国内首批获得…

模拟耗时操作_在集成测试中模拟耗时的动作

模拟耗时操作最近在我的一个项目中&#xff0c;我遇到一种情况&#xff0c;需要为该应用程序创建集成测试。 这不是很奇怪&#xff0c;不是吗&#xff1f; 有趣的是&#xff0c;应用程序的逻辑涉及一些并发问题&#xff0c;并且其中一个组件必须连接到外部服务&#xff0c;这将…

日志消息是可执行代码和注释

尽管在一个人的代码中应添加多少注释之间存在意见分歧&#xff0c;但我认为可以肯定地说&#xff0c;大多数开发人员都同意以下代码段中的注释是多余的&#xff1a; // increment the total total;在该示例中&#xff0c;代码很简单&#xff0c;并且实际上是不言自明的&#x…

代做html网页多少钱,代做排名网站有吗,做排名帮你实现财富自由

影响关键词排名的因素有哪些&#xff1a;1、影响搜索排序的因素前一段&#xff0c;我们在百度搜索排序规则中&#xff0c;实际上已经讨论过这个话题&#xff0c;其中核心的因素主要包括如下内容&#xff1a;① 网站主体与主题的权威度。② 页面内容的专业性以及多样化。③ 网站…

html flash层级,解决FLASH遮住其他层元素问题

刚做了个幻灯片广告&#xff0c;产品人员需要在第一个位置放flash&#xff0c;然后其他的都是图片&#xff0c;但是幻灯片切换到第一张的时候&#xff0c;圆圈tab元素不见了&#xff0c;只有在谷歌浏览器下面正常&#xff0c;用firebug看是被flash盖住了&#xff0c;&#xff0…

电脑没有使用计算机进入睡眠状态,电脑打不开,屏上显示:无视频输入,进入睡眠模式。怎么处理...

1、电脑能正常打开电源&#xff0c;并进行coms自检&#xff0c;但就是不能启动操作系统。光标在黑屏上闪烁&#xff0c;有提示&#xff1a;“Press any key to restar computer.”1)我碰到的这种情况解之道是检查软驱中是否有软盘。为什么要这样做呢&#xff0c;因为很多人的机…

prng伪随机数生成器_Java伪随机数生成器(PRNG)中的弱点

prng伪随机数生成器这将是Kai Michaelis&#xff0c;JrgSchwenk和我撰写的论文的总结&#xff0c;该论文在RSA Conference 2013的密码学家会议上发表 。 你可以得到我的演讲的幻灯片在这里和我们的全文在这里 。 我们对PRNG&#xff08;主要是SecureRandom&#xff09;附带的常…

时钟在微型计算机中作用,微型计算机系统中的实时时钟

实时时钟(RTC)是一种IC&#xff0c;可以跟踪当前时间。微处理器通常可以通过串行接口读取此信息&#xff0c;以方便软件执行与时间有关的功能。RTC专为超低功耗而设计&#xff0c;因为它们通常在主系统断电时仍可继续运行。这样一来&#xff0c;他们就可以根据绝对时间基准(通常…

五个使Java变得更好的功能

我偶然发现了Brian Goetz 提出的有关Java数据类的建议 &#xff0c;立即意识到我也对如何使Java更好地成为一种语言有一些想法。 我实际上有很多&#xff0c;但这只是五个最重要的列表。 专制&#xff08;2006&#xff09;&#xff0c;迈克贾奇&#xff08;Mike Judge&#xf…

nit计算机应用基础是考试大纲,NIT考试大纲--计算机应用基础.doc

NIT考试大纲--计算机应用基础.doc全国计算机应用技术证书考试大纲【 HYPERLINK "javascript:doPrint()" 打印】【字体&#xff1a; HYPERLINK "javascript:doZoom(16)" 大 HYPERLINK "javascript:doZoom(14)" 中 HYPERLINK "javascript:doZ…

html选中列表整列变色,excel选中行变色完整代码和动画效果

内容提要&#xff1a;文章介绍excel选中行变色的效果以及实现选中行变色的VBA代码。在excel中如果行数过多&#xff0c;经常核对数据的准确性&#xff0c;容易错行跳行&#xff0c;所以才有本文的小技巧&#xff1a;excel选中行变色。当我们在excel工作表中&#xff0c;鼠标随便…

java 递归改非递归_使用Java ThreadLocals的意外递归保护

java 递归改非递归对于那些使用第三方工具来尝试扩展它们而又不完全了解它们的人来说&#xff0c;这是一个小技巧。 假定以下情况&#xff1a; 您想扩展一个展示分层数据模型的库&#xff08;假设您要扩展Apache Jackrabbit &#xff09; 该库在访问内容存储库的任何节点之前…

大连理工18秋计算机应用基础,大连理工大学网络教育本科计算机应用基础入学考试模拟题...

大连理工大学网络教育本科计算机应用基础入学考试模拟题一、单选题1. 世界上第一台电子数字计算机采用的电子器件是______。A.大规模集成电路 B.集成电路C.晶体管 D.电子管2. 将计算机分为巨型机、大中型机、小型机、微型机、工作站等五类的分类标准是______。A.计算机处理数据…

构造函数还是静态工厂方法?

我相信Joshua Bloch在他的非常好的书“ Effective Java”中首先说了它&#xff1a;与构造函数相比&#xff0c;静态工厂方法是实例化对象的首选方法。 我不同意。 不仅因为我相信静态方法是纯粹的邪恶&#xff0c;而且主要是因为在这种特殊情况下&#xff0c;它们伪装成好的方法…

html vue分页,Vue.js bootstrap前端实现分页和排序

写之前先抱怨几句。本来一心一意做.net开发的&#xff0c;渐渐地成了只做前端。最近项目基本都用java做后台&#xff0c;我们这些.net的就成了前端&#xff0c;不是用wpf做界面&#xff0c;就是用html写web页面。深知自己前端技术不足&#xff0c;以前虽说用asp.net前后台都做&…

福建计算机及应用专业的大学,33所福建大学公布国家级/省级一流本科专业!

近日&#xff0c;教育部发布《教育部办公厅关于公布2020年度国家级和省级一流本科专业建设点名单的通知》。据悉&#xff0c;本次教育部一流本科专业建设“双万计划”评选共认定了3977个国家级一流本科专业建设点&#xff0c;其中中央赛道1387个、地方赛道2590个&#xff0c;并…

高度有用的Java ChronoUnit枚举

几年前&#xff0c;我发表了博客文章“ The Highly有用的Java TimeUnit Enum ”&#xff0c;其中介绍了JDK 5引入的TimeUnit枚举。 JDK 8引入了一个更新的枚举ChronoUnit &#xff0c;它比TimeUnit更适合于诸如日期/时间操作等并发以外的上下文。 位于所述java.time.temporal包…

计算机管理ap,如何设置AC功能管理无线AP

AC功能管理无线AP第一步、连接ap举例型号TL-ER6520G不同类型的AP供电方式可能有所差异&#xff0c;包括直流电源供电和网线供电(PoE供电)两种。如下[1] 直流电源供电使用自带的电源适配器给AP供电&#xff0c;要求AP安放位置必须有电源插座&#xff0c;优点是节省成本。按照拓扑…

代表机械 计算机技术的颜色,基于机器视觉识别的交通灯控制系统

1、引言机器视觉又称计算机视觉&#xff0c;是用计算机来实现人的视觉功能&#xff0c;也就是用机器代替人眼来做测量和判断。机器视觉技术包含光源照明技术、光成像技术、传感器技术、数字图像处理技术、机械工程技术、检测控制技术、模拟与数字视频技术、计算机技术、人机接口…