细算在Java命令行处理与Apache的百科全书CLI , args4j , jbock和命令行中先前的文章,我把注意力转向在这个岗位使用JewelCli完成的命令行参数相似的处理Java中。
几个Java命令行处理库使用批注来定义命令行选项。 到目前为止,本系列文章涵盖的四个库中的三个都使用注释,JewelCli也是如此。 JewelCli在到目前为止我所介绍的库中是独一无二的,因为它的注释应用在Java接口上,而不是在Java类或类的构造上。 下一个代码清单演示了如何在Java接口上使用批注来实现JewelCli命令行解析的“定义”阶段。
JewelCli“定义”通过带注释的接口实现
package examples.dustin.commandline.jewelcli;import com.lexicalscope.jewel.cli.Option;/*** Interface defining JewelCli-friendly command-line parameters.*/
public interface MainCommandLine
{@Option(shortName="f", description="Name and path of file to be used.")String getFile();@Option(shortName="v", description="Indicate whether status should be reported verbosely.")boolean isVerbose();@Option(helpRequest=true, description="Usage details on command-line arguments.")boolean getHelp();
}
上面显示的简单界面包含许多与命令行处理相关的内容。 这些选项具有使用shortName
注释类型元素显式指定的单连字符简称,并通过“ get”方法的名称隐式指定(尽管longName
注释类型元素可用于显式指定的长名称[double hyphens]版本)开关)。 命令行选项还具有通过Option
注释提供的各自描述。 helpRequest=true
的使用描述了应使用哪种命令行开关来显示用法/帮助信息。 在这种情况下,因为注释方法名为getHelp()
,所以--help
开关将显示用法信息。 如果我将方法命名为getDustin()
并使用@Option(helpRequest=true)
对其进行注释,则该开关将为--dustin
以显示用法。
除了与方法名称匹配的开关的长名称外,JewelCli在配置情况下利用约定优于配置。 如上所示,在注释了命令行选项的相应接口方法定义后,详细程度开关(返回boolean
)是可选的。 需要文件名切换,因为其对应的getFile()
方法返回String
。 如果我想使文件名可选,则可以在getFile()
方法的@Option
注释中提供defaultValue
,例如@Option(defaultValue="")
。
通过使用JewelCli @Option
注释进行注释的接口(在本例中为MainCommandLine
),我们可以使用JewelCli @Option
“解析”阶段。 在Main
的下一个代码清单中,这与“讯问”阶段一起得到了证明。
JewelCli的“解析”和“审讯”阶段
package examples.dustin.commandline.jewelcli;import static java.lang.System.out;import com.lexicalscope.jewel.cli.CliFactory;/*** Demonstrates use of JewelCli for parsing command-line* parameters in Java.*/
public class Main
{public static void main(final String[] arguments){final MainCommandLine main = CliFactory.parseArguments(MainCommandLine.class, arguments);out.println("You specified file '" + main.getFile() + "' with verbosity setting of '" + main.isVerbose() + "'.");}
}
刚刚显示的Main
类的其中一行“解析” [对CliFactory.parseArguments(Class<T>, String...)
的调用],而另一行“询问” [访问JewelWli-上定义的方法的行带注释的接口,如先前所示]。
以下三个屏幕快照展示了实际中基于JewelCli的代码示例。 第一个图像演示了使用--help
查看用法(注意输出中包含堆栈跟踪)。 第二张图片显示了长( -
)和短( --
)选项开关的不同组合。 第三个图像显示了当未提供必需的命令行参数(在这种情况下为--file
或-f
)时显示的输出消息和关联的堆栈跟踪。
GitHub上提供了本文中用于演示JewelCli应用的这两个类的代码清单。
在选择库来帮助Java进行命令行解析时,需要考虑JewelJli的一些其他特性。
- JewelCli是开源的,并根据Apache软件许可版本2获得许可 。
- 当前的JewelCli ( 0.8.9 )JAR(
jewelcli-0.8.9.jar
/ 2014年2月)大小约为542 KB。 - 无需其他库即可使用JewelCli。
- 如上面的示例所示,JewelCli在Java接口上使用“定义”阶段的注释。 任何以类似方式注释类“ get”方法的尝试都会在运行时产生诸如“ IllegalArgumentException:…不是接口”之类的消息。
- 但是,JewelCli确实支持替代的基于类/实例的方法 ,该方法是对类上的“设置”方法进行注释,而不是对接口上的“获取”方法进行注释。
- JewelCli允许接口从超级接口继承,并且在继承接口中将支持父接口中定义的
@Option
。 - 界面中注释的方法的返回数据类型提供了命令行选项值的类型强制。 枚举甚至可以用作返回数据类型,以将可能的命令行选项类型缩小到一组有限的可能性。
JewelCli易于使用,并且由于其在配置方法方面的约定,因此只需很少的代码即可定义,解析和询问命令行参数。 我发现为定义可解析的命令行选项的接口添加注释的推荐方法在美学上也很令人满意。
其他资源
- JewelCli
- GitHub上的JewelCli
- Maven上的JewelCli
- JewelCli使用介绍
- JewelCli文档/博客
- JewelCLI:Java的简单CLI界面
- JewelCli:替代方案,评论,博客文章和用户
翻译自: https://www.javacodegeeks.com/2017/07/java-command-line-interfaces-part-5-jewelcli.html