个人网站代码模板/我想找一个营销团队

个人网站代码模板,我想找一个营销团队,旅游网站的建设方式,北京两学一做网站介绍 Picocli是一个单文件命令行解析框架,它使您几乎不需要任何代码即可创建命令行应用程序。 使用Option或Parameters注释应用程序中的字段,picocli将分别使用命令行选项和位置参数填充这些字段。 例如: Command(name "Greet", …

介绍

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 。 所有这些都提供了自动帮助:如果用户请求了useHelpHelp或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/348668.shtml

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

相关文章

移动通信—无线波传播

无线波传播 发射天线或自然辐射源所辐射的无线电波,通过自然条件下的媒质到达接受天线的过程称为无线电波传播。无线电波与可见光、X射线与γ射线-.样同属于电磁波,它们都是以电场和磁场为其特征的- -种电场震动。电磁波的频谱范围很宽,从几赫到3X 1023Hz(波长从几十兆米到10-9…

使用Dropwizard度量标准监视和测量无功应用

在上一篇文章中&#xff0c;我们创建了一个简单的索引代码&#xff0c;该代码可以对ElasticSearch进行数千个并发请求。 监视系统性能的唯一方法是老式的日志记录语句&#xff1a; .window(Duration.ofSeconds(1)) .flatMap(Flux::count) .subscribe(winSize -> log.debug(…

移动通信-多径效应,多普勒效应,菲涅尔区,阴影效应,快衰落,慢衰落

多径效应 信号从发射端到接收端常有许多时延不同、损耗各异的传输路径&#xff0c;可以是直射、反射或是绕射。无线电波的多径效应是指不同路径的相同信号在按收端叠加会增大或减小接收信号能量的现象。 时间色散 在无线通信中&#xff0c;无线电波从发射端到接收端会经过直射、…

四旋翼

更新2018/11 1系统设计 硬件总体框架&#xff08;认识四旋翼的基本组成&#xff09; 机架主要的两种&#xff08;x型控制更难&#xff0c;动作灵活&#xff09; 十字型,X字型 桨 7040,8045&#xff08;常用&#xff09;&#xff0c;前四位直径&#xff0c;后四位角度 正反螺旋…

hotspot线程模型_Linux上的HotSpot GC线程CPU占用空间

hotspot线程模型以下问题将测试您对Linux操作系统上运行的Java应用程序的垃圾收集和高CPU故障排除的知识。 当调查过多的GC和/或CPU利用率时&#xff0c;此故障排除技术尤其重要。 它将假定您无权使用高级监控工具&#xff0c;例如Compuware dynaTrace甚至JVisualVM。 将来将介…

数字信号处理实验一

补充2019/10/26 (1)序列的加、减、乘、除和乘方运算。输入A[1 2 3 4]&#xff0c;B[3 4 5 6]&#xff0c;起点n0&#xff0c;求CAB&#xff0c;DA-B&#xff0c;EA.*B&#xff0c;FA./B&#xff0c;GA.^B&#xff0c;并用stem语句画出A&#xff0c;B&#xff0c;C&#xff0c;D…

SRP是骗局

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

数字信号处理实验二

补2019/11/2 &#xff08;1&#xff09;编写函数如xsiAdd(x1,n1,x2,n2),实现两个序列x1和x2的相加&#xff0c;其中x1的下标为n1n1s:nlf&#xff0c;x2的下标为n2n2s:n2f。绘制出该函数的图形。设x1&#xff08;n&#xff09;n,0≦n1≦9,x2(n)n,4≦n2≦15。 &#xff08;2&…

apache camel_使用Apache Camel发布/订阅模式

apache camel发布/订阅是一种简单的消息传递模式&#xff0c;其中&#xff0c;发布者将消息发送到某个频道&#xff0c;而无需知道谁将接收消息。 然后&#xff0c;通道负责将消息的副本传递给每个订户。 此消息传递模型可以创建松耦合和可伸缩的系统。 这是一种非常常见的消息…

Java 9:JShell

JShell是Java 9中引入的新工具&#xff0c;用于评估在命令行上输入的Java语句。 它是Java平台上第一个正式的REPL&#xff08;读取-评估-打印循环&#xff09;实现&#xff0c;非常适合尝试Java代码而无需启动IDE或编写完整的程序&#xff01; 要运行JShell&#xff0c;只需在…

三句话介绍清楚滑动窗口协议/GBN/SR

滑动窗口协议、GBN、SR之间不得不说的故事 首先我们来介绍什么是滑动窗口协议 滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;属于TCP协议的一种应用&#xff0c;用于网络数据传输时的流量控制&#xff0c;以避免拥塞的发生。该协议允许发送方在停…

《计算机网络自顶向下》之重头戏迪杰斯特拉算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始&#xff0c;采用贪心算法的策略&…

新闻发布系统java ee_Java EE 7发布–反馈和新闻报道

新闻发布系统java eeJava EE 7已经存在了几天。 我们所有人都有机会观看直播活动或可用的重播 。 最后的MR版本完成了将其工作推向JCP的工作&#xff0c;基本上是一个总结。 是时候反思发生的事情和我对此的想法了。 启动活动中的社区参与 它不是一个大秘密。 即使Oracle的Jav…

在即将发布的Camel 2.21版本中改进了使用Apache Camel和ActiveMQ Artemis处理大型消息的功能...

从历史上看&#xff0c; Apache ActiveMQ消息代理最初是在大型消息以MB为单位而不是GB的情况下创建的&#xff0c;就像您今天所做的那样。 下一代代理Apache ActiveMQ Artemis&#xff08;或仅是Artemis&#xff09;则不是这种情况&#xff0c;后者对大消息有更好的支持。 因…

深入浅出组合逻辑电路(1)

定义&#xff1a;电路在任意时刻的输出仅由该时刻的输入信号决定&#xff0c;与之前的输入信号无关。 组合电路通常有一些逻辑门构成&#xff0c;许多具有典型功能的组合电路已经集成为商品电路。&#xff08;加法器&#xff0c;译码器等&#xff09; 分析步骤&#xff1a; …

深入浅出逻辑组合电路(2)

深入浅出逻辑组合电路&#xff08;2&#xff09; 门电路中的冒险现象 通常讨论逻辑电路时&#xff0c;只从抽象的逻辑角度进行描述&#xff0c;不考虑实际电路中必然存在的信 号传输时延和信号电平变化时刻对逻辑功能的影响。逻辑门的传输时延以及多个输入信号变 化时刻不同步…

学习数字电路必须知道的几种编码

2-10进制编码&#xff08;BCD编码&#xff09; BCD码&#xff1a;使用一个四位二进制代码表示一位十进制数字的编码方法。 一、8421码 选取0000~1001表示十位二进制数 0到9 按自然顺序的二进制数表示所对应的十进制数字&#xff0c;是有权码&#xff0c;从高位到地位的权依…

Packt发行的$ 5 Java编程书籍:精通Java 9,Java 9 High Performance

您好极客&#xff01; 今天&#xff0c;我们为您带来一些激动人心的消息&#xff01; Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 本周&#xff0c;我们提供Java相关书籍的折扣&#xff0c;以帮助您理解和掌握Java。 他们全都打折到每本书5美元 &#xff01;…

深入浅出组合逻辑电路(3)常见的几种编码器

编码器是啥&#xff1f; 下面介绍几种常见的编码器 答&#xff1a;编码器是实现编码的数字电路&#xff0c;对于每个有效的输入信号&#xff0c;编码器输出与之对应的一组二进制代码。 2^n-n线编码器 是最基本的编码器 图示为8-3线译码器 输入为8个代编码信号&#xff0c;…

深入浅出逻辑电路(4)介绍几种常见的译码器

译码器是啥&#xff1f; 输入一组二进制编码&#xff0c;输出一个有效的信号 译码器输入的 n 位二进制代码有2n种取值&#xff0c;称为2n种不同的编码值。若将每种编码分别译出&#xff0c;则译码器有2n个译码输出端&#xff0c;这种译码器称为全译码器。 若译码器的输入编码…