在本系列中有关使用Java进行命令行分析的前两篇文章中,我介绍了Apache Commons CLI和args4j库。 在本系列的第三篇文章中,我将介绍jbock ,它是自我描述的“非常简单的CLI解析器”。
我在Java中进行命令行解析的文章使用了一些示例,这些示例基于向Java应用程序提供必需的文件名和可选的详细标志。 本文中使用了相同的方法来演示jbock 1.8 。 GitHub上提供了示例类的完整源代码,但是jbock( Main_Parser
)生成的代码不可用,因为它可以生成。
jbock用于命令行处理的方法与先前介绍的两个解析库所使用的方法不同。 前面介绍的库需要Java代码来解析命令行参数,以针对该库的JAR构建和执行这些参数。 换句话说,库的JAR必须同时在编译时( javac )类路径和运行时Java启动器( java )类路径中。 相反,jbock方法仅在编译时依赖于jbock JAR的包含。 jbock方法生成的Java源代码完全独立于jbock库。 例如,可以选择运行jbock一次生成这些Java源代码文件,然后对这些生成的文件进行版本控制,并且从那时开始仅对生成的文件进行构建和运行,而无需对jbock的JAR进行构建或运行。 仅当需要重新生成生成的Java源代码时,才需要jbock JAR。 由于生成的代码是基于自定义Java类上的注释生成的,因此jbock代码生成在大多数情况下可能会作为常规构建的一部分而不是版本控制生成的源代码来执行。
在大多数情况下,当使用jbock解析命令行参数时,我将使用一个自定义类,其名称为“ Arguments
”或“ CommandLine
”。 但是,对于本篇文章,我使用的是一个简单的Main
类,其示例与本系列其他文章中的其他命令行解析库所使用的方法更相似。 像args4j一样,jbock在命令行处理的“定义”阶段使用注释。 但是,jbock的注释位于类的构造函数及其参数上,而不是args4j的注释类字段的方法。 下一个代码清单中演示了基于jbock构造函数的注释方法。
命令行选项的jbock“定义”
@CommandLineArguments
public Main(@ShortName('v') @LongName("verbose") @Description("Verbosity enabled?")final boolean newVerbose,@ShortName('f') @LongName("file") @Description("File name and path")final Optional<String> newFileName)
{verbose = newVerbose;file = newFileName.orElse("");
}
// . . .
下一个代码清单中演示了使用jbock进行命令行处理的“解析”阶段。
用jbock“解析”命令行选项
final Main_Parser parser = new Main_Parser();
final Main_Parser.Binder binder = parser.parse(arguments);
final Main main = binder.bind();
上面代码清单中显示的Main_Parser
类是jbock根据第一个代码清单中显示的注释生成的。 jbock库处理Main
类的注释,以确定如何构建Main_Parser
类。 生成的类的名称基于带有jbock批注的类的名称,并与_Parser
串联。 例如,如果将带有jbock注释的构造函数的类和构造函数参数命名为“ Arguments
”,则生成的类将命名为“ Arguments_Parser
”。
在命令行参数上调用了生成的Main_Parser
类的实例的parse
调用该实例的bind()
方法以返回原始带注释的Main
类的实例。 此时的“询问”过程仅包括通过其公共“获取”方法访问该Main
实例的属性。 下一个代码清单对此进行了演示。
使用jbock进行命令行处理的“询问”阶段
out.println("The file '" + main.getFile() + "' was provided and verbosity is set to '"+ main.isVerbose() + "'.");
下面的屏幕快照演示了使用jbock解析命令行选项的代码。
如果需要帮助或用法信息,也可以从生成的*_Parser
(在这种情况下为Main_Parser
)类中检索该信息。 具体来说,生成的*_Parser
类包括表示各个选项的嵌套Option
枚举。 可以遍历那些选项的枚举值以检索有关每个选项的元数据。 在下面的代码清单中,对每个选项的枚举值(所传入的整数是要缩进的空格数describe(int)
调用describe(int)
方法。
使用jbock获取用法详细信息
final Main_Parser parser = new Main_Parser();
if (arguments.length < 1)
{for (final Main_Parser.Option option : Main_Parser.Option.values()){out.println(option.describe(3));}System.exit(-1);
}
接下来显示的屏幕快照演示了该代码的实际作用,以打印出选项及其说明。
这篇文章中讨论的源代码可以在GitHub上找到 。
这是在选择框架或库来帮助Java进行命令行解析时要考虑的jbock的其他一些特征。
- jbock可作为开源软件使用 。
- 当前版本的jbock(1.8)需要Java SE 8 。
- jbock没有第三方或外部依赖项。
- jbock 1.8 JAR(
jbock-1.8.jar
)的大小约为131 KB,但这并不像类似库那么重要,因为在运行时不需要此JAR(生成的代码独立于JAR)。 - 我没有演示jbock强制执行必需的命令行参数,因为它故意不支持该功能。 自述文件指出:“特意简单:没有转换器,默认值或要求检查 。 使用Java 8,可以很容易地手动添加这些东西。”
jbock与其他大多数基于Java的命令行解析库不同的最明显特征是,完全在编译时生成了解析代码,这对jbock库没有任何运行时依赖性。 在担心装入的类数或表示的类路径的大小的情况下,这将是一个明显的优势。 自述文件列出了多个“将[jbock]分开”的项目。 其中包括“无反射,纯静态分析”和“通过构造函数的便捷,灵活的属性绑定”。
翻译自: https://www.javacodegeeks.com/2017/06/java-command-line-interfaces-part-3-jbock.html