做好计划事半功倍论文_Picocli 2.0:事半功倍

做好计划事半功倍论文

介绍

Picocli是一个单文件命令行解析框架,它使您几乎不需要任何代码即可创建命令行应用程序。 使用@Option@Parameters注释应用程序中的字段,picocli将分别使用命令行选项和位置参数填充这些字段。 例如:

@Command(name = "Greet", header = "%n@|green Hello world demo|@")
class Greet implements Runnable {@Option(names = {"-u", "--user"}, required = true, description = "The user name.")String userName;public void run() {System.out.println("Hello, " + userName);}public static void main(String... args) {CommandLine.run(new Greet(), System.err, args);}
}

当我们执行该程序时,picocli会在调用run方法之前解析命令行并填充userName字段:

$ java Greet -u picocliHello, picocli

Picocli生成具有Ansi颜色和样式的使用帮助消息。 如果我们在输入无效的情况下运行上述程序(缺少必需的用户名选项),picocli将显示错误和使用帮助消息:

Picocli可以生成一个自动完成脚本,该脚本允许最终用户使用<TAB>命令行完成功能来发现可用的选项和子命令。 您可能还喜欢picocli对子命令和嵌套子子命令的任何深度的支持。

用户手册详细介绍了picocli的功能。 本文重点介绍了picocli 2.0版本引入的新功能和值得注意的功能。

带有位置参数的混合选项

解析器得到了改进,现在可以在命令行中将位置参数与选项混合使用。

以前,位置参数必须遵循选项。 从此版本开始,任何不是选项或子命令的命令行参数都将被解释为位置参数。

例如:

class MixDemo implements Runnable {@Option(names = "-o")List<String> options;@ParametersList<String> positional;public void run() {System.out.println("positional: " + positional);System.out.println("options   : " + options);}public static void main(String[] args) {CommandLine.run(new MixDemo(), System.err, args);}
}

通过混合使用选项和位置参数来运行上述类,表明将非选项识别为位置参数。 例如:

$ java MixDemo param0 -o AAA param1 param2 -o BBB param3positional: [param0, param1, param2, param3]
options   : [AAA, BBB]

为了支持带有位置参数的混合选项,解析器已更改。 在picocli 2.0中, 默认情况下 ,多值选项(数组,列表和地图字段) 不再贪婪 。 2.0发行说明详细描述了此更改和其他可能的重大更改 。

发现集合类型

Picocli执行将命令行参数自动类型转换为带注释字段的类型。 命名选项和位置参数都可以强类型化。

在v2.0之前,picocli需要在CollectionMap字段中标注type属性,以便能够进行类型转换。 对于其他类型的字段,例如数组字段和intjava.io.File字段等单值字段,picocli会自动从字段类型中检测目标类型,但是集合和映射需要更多详细的注释。 例如:

class Before {@Option(names = "-u", type = {TimeUnit.class, Long.class})Map<TimeUnit, Long> timeout;@Parameters(type = File.class)List<File> files;
}

从v2.0开始,对于CollectionMap字段不再需要type属性:picocli将根据通用类型推断出collection元素的类型。 type属性仍然可以像以前一样工作,在大多数情况下只是可选的。

省略type属性可消除某些重复,并产生更简单,更简洁的代码:

class Current {@Option(names = "-u")Map<TimeUnit, Long> timeout;@ParametersList<File> files;
}

在上面的示例中,picocli 2.0能够自动发现将命令行参数添加到列表之前需要将其转换为File ,对于地图而言,键需要转换为TimeUnit且值必须转换为Long

自动帮助

Picocli提供了许多便利的方法,例如runcall ,它们可以解析命令行参数,处理错误并调用接口方法来执行应用程序。

从此版本开始,当用户在命令行上指定带有versionHelpusageHelp属性注释的选项时,便捷方法还将自动打印使用帮助和版本信息。

下面的示例程序演示了自动帮助:

@Command(version = "Help demo v1.2.3", header = "%nAutomatic Help Demo%n",description = "Prints usage help and version help when requested.%n")
class AutomaticHelpDemo implements Runnable {@Option(names = "--count", description = "The number of times to repeat.")int count;@Option(names = {"-h", "--help"}, usageHelp = true,description = "Print usage help and exit.")boolean usageHelpRequested;@Option(names = {"-V", "--version"}, versionHelp = true,description = "Print version information and exit.")boolean versionHelpRequested;public void run() {// NOTE: code like below is no longer required://// if (usageHelpRequested) {//     new CommandLine(this).usage(System.err);// } else if (versionHelpRequested) {//     new CommandLine(this).printVersionHelp(System.err);// } else { ... the business logicfor (int i = 0; i < count; i++) {System.out.println("Hello world");}}public static void main(String... args) {CommandLine.run(new AutomaticHelpDemo(), System.err, args);}
}

-h--help一起执行时,程序将输出用法帮助:

类似地,当使用-V--version执行时,程序将输出版本信息:

自动打印帮助的方法:

  • CommandLine :: call
  • 命令行::运行
  • CommandLine :: parseWithHandler(带有内置的Run ...处理程序)
  • CommandLine :: parseWithHandlers(带有内置的Run ...处理程序)

不会自动打印帮助的方法:

  • CommandLine :: parse
  • 命令行:: populateCommand

更好的子命令支持

此版本添加了新的CommandLine::parseWithHandler方法。 这些方法提供了与runcall方法相同的易用性,但具有更大的灵活性和对嵌套子命令的更好支持。

考虑带有子命令的应用程序需要做什么:

  1. 解析命令行。
  2. 如果用户输入无效,则在解析失败的地方为子命令打印错误消息和用法帮助消息。
  3. 如果解析成功,请检查用户是否为顶级命令或子命令请求了使用帮助或版本信息。 如果是这样,请打印所需的信息并退出。
  4. 否则,执行业务逻辑。 通常,这意味着执行最特定的子命令。

Picocli提供了一些构建基块来完成此任务,但应由应用程序将它们连接在一起。 该接线本质上是样板,在应用程序之间非常相似。 例如,以前,带有子命令的应用程序通常包含如下代码:

public static void main() {// 1. parse the command lineCommandLine top = new CommandLine(new YourApp());List<CommandLine> parsedCommands;try {parsedCommands = top.parse(args);} catch (ParameterException ex) {// 2. handle incorrect user input for one of the subcommandsSystem.err.println(ex.getMessage());ex.getCommandLine().usage(System.err);return;}// 3. check if the user requested helpfor (CommandLine parsed : parsedCommands) {if (parsed.isUsageHelpRequested()) {parsed.usage(System.err);return;} else if (parsed.isVersionHelpRequested()) {parsed.printVersionHelp(System.err);return;}}// 4. execute the most specific subcommandObject last = parsedCommands.get(parsedCommands.size() - 1).getCommand();if (last instanceof Runnable) {((Runnable) last).run();} else if (last instanceof Callable) {Object result = ((Callable) last).call();// ... do something with result} else {throw new ExecutionException("Not a Runnable or Callable");}
}

这是很多样板代码。 Picocli 2.0提供了一种便捷的方法,使您可以将以上所有内容简化为一行代码,以便您可以专注于应用程序的业务逻辑:

public static void main() {// This handles all of the above in one line:// 1. parse the command line// 2. handle incorrect user input for one of the subcommands// 3. automatically print help if requested// 4. execute one or more subcommandsnew CommandLine(new YourApp()).parseWithHandler(new RunLast(), System.err, args);
}

新的便捷方法是parseWithHandler 。 您可以创建自己的自定义处理程序,也可以使用内置处理程序之一。 Picocli提供了一些常见用例的处理程序实现。

内置处理程序为RunFirstRunLastRunAll 。 所有这些都提供了自动帮助:如果用户请求了usageHelp或versionHelp,则将打印所请求的信息,并且处理程序将返回而无需进一步处理。 处理程序希望所有命令都实现java.lang.Runnablejava.util.concurrent.Callable

  • RunLast执行最特定的命令或子命令。 例如,如果用户调用了java Git commit -m "commit message" ,则picocli会将Git视为顶级命令并commit一个子命令。 在此示例中, commit子命令是最特定的命令,因此RunLast仅执行该子命令。 如果没有子命令,则执行顶层命令。 RunLast现在由picocli内部使用,用于执行现有CommandLine::runCommandLine::call方便的方法。
  • RunFirst仅执行first ,顶层命令,并忽略子命令。
  • RunAll执行顶层命令和出现在命令行上的所有子命令。

还有一个parseWithHandlers方法,该方法与此类似,但另外,您还可以为错误的用户输入指定自定义处理程序。

改进的

CommandLine::callCommandLine::run便捷方法现在支持子命令,并将执行用户指定的最后一个子命令。 以前,子命令将被忽略,仅执行顶层命令。

改进的例外

最后,从该版本开始,所有picocli异常都提供了getCommandLine方法,该方法在解析或执行失败的情况下返回命令或子命令。 以前,如果用户为带有子命令的应用程序提供了无效的输入,则很难准确地指出哪个子命令未能解析输入。

结论

如果您已经在使用picocli,则v2.0是必不可少的升级。 如果您以前从未使用过picocli,希望以上内容使您有兴趣尝试一下。

其中许多改进源自用户反馈和后续讨论。 请毫不犹豫地在picocli 问题追踪器上提问,索取功能或提供其他反馈。

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

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

做好计划事半功倍论文

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

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

相关文章

halcon python缺陷检测_Halcon学习笔记之缺陷检测(一)

*surface_scratch.hdev:extraction of surface scratches via local thresholding and morphological post-processing*dev_close_window()dev_update_window(‘off’)******step: acquire image //获取图片*****read_image(Image,’surface_scratch’) //读入图片名为’surfac…

Linux 脚本文件中开头的#!/bin/bash和#!/bin/sh是什么意思

解释 #!/bin/sh&#xff1a;表示此脚本使用 /bin/sh 来解释执行&#xff0c;#! 是特殊的表示符&#xff0c;其后面跟的是解释此脚本的 shell 的路径。 我们知道 shell 有很多种&#xff0c;例如&#xff0c;bash、csh、sh等&#xff0c;sh 是其中的一种&#xff0c;命令文件所…

srp unity_SRP是骗局

srp unity根据罗伯特马丁 &#xff08; Robert Martin&#xff09;的 《 清洁法 》&#xff08; Clean Code&#xff09; &#xff0c;“ 单一责任原则 ”意味着“一个阶级应该只有一个改变的理由”。 让我们尝试解密这个模糊的语句&#xff0c;看看它如何帮助我们设计更好的面…

html5app大赛,Anyoffice -HTML5大赛 悦心(基于H5开发安卓音乐app)-项目总结

悦心,一款音乐播放器应用。由“女立方”团队开发。眼下。较为流行的音乐播放器有QQ音乐、网易云音乐、多米音乐等。“悦心”音乐播放器的主要功能&#xff0c;提供音乐数据库&#xff0c;点击列表播放音乐&#xff0c;还可对歌曲进行收藏。加入专属音乐心情功能。1.歌曲播放过程…

如何执行shell脚本文件

文章目录 一、使用 shell 命令解释器执行脚本二、使用命令 source 执行脚本文件三、使用路径方式执行脚本文件为什么不能在当前目录直接执行当前目录下的脚本文件呢?四、使用命令 exec 执行脚本文件五、它们有什么区别六、验证是否开启子进程(一)通过父 shell 中的变量是否正…

python 40位的数减个位数_Python——进制表示与转换

在前面两篇文章中介绍了基本的数据类型(Python——记录3——数据类型1&#xff0c;Python——记录4——数据类型2)&#xff0c;其中讲到浮点数的计算是通过转换成二进制进行的&#xff0c;那么到底什么是二进制&#xff0c;以及计算机到底包含了哪些进制呢&#xff1f;其实0和1…

javaee概览_Java 9概览

javaee概览对于许多Java 9来说&#xff0c;似乎是一个维护版本&#xff0c;它推动了不能在Java 8中实现的项目Jigsaw。但是&#xff0c;随着JDK中的新模块系统以及与之相关的许多内部更改&#xff0c;Java 9也带来了开发人员工具箱中一些很棒的新内容。 以下是重点内容&#xf…

Linux 命令之 source -- 在当前Shell环境中从指定文件读取和执行命令

文章目录一、命令介绍二、命令格式三、命令示例一、命令介绍 source 命令会在当前 Shell 环境中从指定文件读取和执行命令。source 命令通常用于重新执行刚修改的初始化文件&#xff0c;使之立即生效&#xff0c;而不必注销并重新登录。 source 命令&#xff08;从 C Shell 而…

opc调试软件_组态王和三菱OPC软件完美演绎天塔之光

许多朋友因为在学习组态王的过程中因为没有实物PLC而发愁&#xff0c;这里我通过天塔之光实例分享一个三菱OPC软件模拟实物PLC与组态王通信的方法。一、需要软件组态王软件三菱PLC编程软件GX Works2三菱OPC软件MX OPC Configurator二、控制要求主画面如上图所示的天塔灯光&…

jar混淆,防止反编译,Allatori工具混淆jar包

文章目录 Allatori工具简介下载解压配置config.xml注意事项 Allatori工具简介 官网地址&#xff1a;https://allatori.com/ Allatori不仅混淆了代码&#xff0c;还最大限度地减小了应用程序的大小&#xff0c;提高了速度&#xff0c;同时除了你和你的团队之外&#xff0c;任何人…

计算机基础知识学前自测,2011计算机二级C语言学前自测题:DOS的基本操作

DOS的基本操作1.DOS系统启动后&#xff0c;下列文件中常驻内存的是( )。A)DOS.COM B)COMMAND.COMC)DISKCOPY.COM D)SYS.COM2.若当前盘为C盘&#xff0c;在A盘目录\data中只有文本文件test.DAT&#xff0c;A 盘当前目录为根目录&#xff0c;则查看该文件的内容可使用的命令是( )…

string拆分为int_拆分为流

string拆分为int我正在为我工​​作的公司准备正则表达式教程更新。 原始教程创建于2012年&#xff0c;从那时起Java发生了一点变化。 有新的Java语言版本&#xff0c;尽管Java中的正则表达式处理仍不完善&#xff08;nb。它仍使用非确定性FSA&#xff09;&#xff0c;但仍有一…

Linux 命令之 type -- 显示指定命令的类型

文章目录一、命令介绍二、命令格式三、命令类型四、常用选项五、命令示例&#xff08;一&#xff09;查看命令的类型&#xff08;二&#xff09;显示外部命令的绝对路径一、命令介绍 type 命令用来显示指定命令的类型&#xff0c;判断给出的指令是内部指令还是外部指令。 二、…

python 查找算法_python快速查找算法应用实例

文实例讲述了Python快速查找算法的应用&#xff0c;分享给大家供大家参考。具体实现方法如下&#xff1a;import randomdef partition(list_object,start,end):random_choice start#random.choice(range(start,end1))#把这里的start改成random()效率会更高些x list_object[ra…

驾校约车html网站源码,html5首汽约车微信感恩活动页面模板

html5整屏滚动css3特效&#xff0c;各种c3特效&#xff0c;手机端支持各种分辨率&#xff0c;感恩活动微信页面模板下载。资源下载此资源下载价格为4D币&#xff0c;请先登录资源文件列表codedown123-0831-42/css/animate.min.css , 61353codedown123-0831-42/css/reset.css , …

java+解析未知json_在Java中解析JSON时如何忽略未知属性– Jackson @JsonIgnoreProperties注释示例...

java解析未知json使用Jackson API在Java中解析JSON时的常见问题之一是&#xff0c;当您的JSON包含未知属性&#xff08;即您的Java类没有对应于所有JSON属性的所有字段&#xff09;时&#xff0c;该操作将失败。 例如&#xff0c;如果您正在使用REST Web服务中的JSON&#xff0…

双非计算机考研推荐学校传菜电梯,22考研双非院校排名Top100,前3名竟然是这几所!...

原标题&#xff1a;22考研双非院校排名Top100&#xff0c;前3名竟然是这几所&#xff01;大家好&#xff01;这里考个研吧&#xff01;近年来&#xff0c;很多双非高校发展进步很快&#xff0c;实力超过很多末流211大学&#xff01;国家也实行了双一流、学科评估等&#xff0c;…

按压缩格式整理打包(解包)和压缩(解压)命令

文章目录一、zip 格式&#xff08;一&#xff09;使用命令 zip 压缩文件&#xff08;二&#xff09;使用命令 unzip 解压 zip 包二、tar 格式&#xff08;一&#xff09;打包文件&#xff08;二&#xff09;解包 tar 包三、tar.gz 格式方式一&#xff1a;利用已经打包好的tar文…

4线电子围栏安装示意图_知识积累|周界防护-脉冲电子围栏的安装

如今人们对于住宅需求早已今非昔比&#xff0c;不但需要足够大的空间&#xff0c;而且对于住宅所处位置是否交通便利&#xff0c;环境如何&#xff0c;光照情况都有要求&#xff0c;但是最关注的问题还是住宅的安全问题。如今的社会科技发达&#xff0c;不法分子的手段也层出不…

非对称加密 公钥私钥_选择Java加密算法第3部分–公钥/私钥非对称加密

非对称加密 公钥私钥抽象 这是涵盖Java加密算法的三部分博客系列的第3部分。 该系列涵盖如何实现以下功能&#xff1a; 使用SHA–512散列 使用AES–256的单密钥对称加密 RSA–4096 这第三篇文章详细介绍了如何实现非对称的RSA-4096公/私钥加密。 让我们开始吧。 免责声明 …