java登录界面命令
本系列有关从Java解析命令行参数的系列简要介绍了28个开源库,这些库可用于处理Java代码中的命令行参数。 即使涵盖了这28个库,该系列也没有涵盖用于解析Java命令行选项的所有可用开源库。 例如,本系列文章未涉及docopt , dolphin getopt , DPML CLI ,“其他” JArgP , java-getopt , ritopt , TE-CODE Command以及可能很多我不知道的其他库。 这篇文章着眼于人们在尝试决定是否用Java滚动自己的命令行参数解析代码与使用现有的众多命令行解析库之一时可能要考虑的因素。
乍一看,很容易说某人用Java开发自己的命令行解析代码可能会遭受“ Not Invented Here Syndrome”的困扰。 但是,我仍然偶尔会编写自己的简单命令行处理代码,并概述执行此操作的情况。
本系列涵盖的许多库都很小。 但是,对于命令行解析非常简单的情况,即使这些较小的库也可能比手头工作需要的库重。 我在本文中显示的示例就是可能适合此类的类型。 开发人员开发自定义命令行处理代码的可能性可能会随着所需命令行解析的复杂性增加以及向自己的部署环境引入新库的难度降低而增加。 过程也可能影响决策,因为某些开发人员可能选择实施自己的命令行处理代码,而不是等待使用所标识库的必要批准。
对于Java不选择使用命令行解析库的最简单情况显然是那些不需要命令行参数的情况。 实际上,由于许多人使用Web服务器,应用程序服务器或其他容器(例如Spring)来运行他们不考虑命令行的程序,因此可能有更多的Java开发人员从未或很少使用命令行选项。对其应用进行解析。 即使是一些简单的基于命令行的应用程序也可以假定值或从假定的位置读取值,而无需将参数传递给它们。
如果我只有一个参数要从命令行读取,我将自己编写该简单代码。 Java教程的“ 命令行参数”部分介绍了Java中命令行参数的基本处理。 通过经典的“ public static void main
”函数的String[]
或String...
参数向Java应用程序提供Java可执行应用程序名称后的命令行中的零至许多字符串。 下面的简单代码清单指示了如何处理单个预期的命令行参数。
解析单个必需参数
/**
* Demonstrate processing a single provided argument.
*
* @param arguments Command-line arguments; expecting a
* String-based name.
*/
public static void main(final String[] arguments)
{
if (arguments.length < 1)
{
out.println("\nNo name provided; please provide a name.\n");
out.println("\tUSAGE: SingleArgMain <name>");
}
else
{
out.println("Hello " + arguments[0] + "!");
}
}
上面的代码很容易编写,因为只有一个命令行选项,它没有自变量,因此它是必需的。 有了所有这些假设,编写命令行解析代码相对容易。
如果应用程序需要两个参数,则无需第三方库就可以直接在Java中直接处理此参数。 在下面的代码清单中对此进行了演示,该清单模拟了一个应用程序,该应用程序接受要验证的XML文件的名称/路径以及要对该XML进行验证的XSD的名称/路径。
解析两个必需的参数
/**
* Demonstrate processing two required provided arguments.
*
* @param arguments Command-line arguments; expecting a String-based
* path and file name of an XML file to be validated and a
* String-based path and file name of the XSD file against which
* the XML file will be validated.
*/
public static void main(final String...arguments)
{
if (arguments.length < 2)
{
out.println("\nXML file path/name and XSD file path/name not provided.\n");
out.println("\tUSAGE: TwoArgsMain <xmlFilePathAndName> <xsdFilePathAndName>");
}
else
{
out.println("The provided XML file is '" + arguments[0]
+ "' and the provided XSD file is '" + arguments[1] + "'.");
}
}
在本系列的文章中 ,我使用了一些示例,这些示例期望一个指定文件路径/名称的必需选项和一个表示启用的详细程度的可选选项。 在所有这些示例中,文件路径/名称选项是标志名称( -f
和/或--file
),后跟该选项的“参数”或“值”。 对于这些示例,verbosity选项没有与之关联的参数或值,并且-v
或--verbose
隐含启用的冗长性。 如果我愿意稍稍更改方法并假设第一个命令行选项是文件路径/名称,并假设详细程度标志(如果提供)出现在Java库之后,那么在没有库的Java中完成目录特别容易。文件路径/名称。 另一个使之容易实现的假设是假设由于文件路径/名称是第一个,因此我实际上不需要使用-file
或-f
类的标志。 有了所有这些假设后,下面显示代码示例。
系列示例:解析一个必需的选项和一个可选的选项
/**
* Demonstrate parsing of command-line options for required file
* path/name and for optional verbosity.
*
* @param arguments Expected command-line arguments; first String
* should be file path/name and, if applicable, second String
* should be the verbosity flag (-v or --verbose).
*/
public static void main(final String[] arguments)
{
if (arguments.length < 1)
{
out.println("\nNo file path/name provided; please provide a file path/name.\n");
out.println("\tUSAGE: SeriesExample <filePathAndName> [-v|--verbose]");
}
else
{
final String file = arguments[0];
final String verboseString = arguments.length > 1 ? arguments[1] : "";
final boolean verbose = verboseString.equals("-v") || verboseString.equals("--verbose");
out.println("File path/name is '" + file + "' and verbosity is " + verbose);
}
}
到目前为止,由于这些示例的这些特征,我具有相对简单的命令行解析选项:
- 假定命令行参数的顺序不可更改。
- 从来没有一个以上的可选命令行参数,而最后一个可选参数是预期的。
- 永远不需要包含标志和与该标志关联的值的命令行参数。
- 没有选项依赖于任何其他选项。
刚刚提到的特性使从Java解析命令行选项更加容易,因为通过要求选项的顺序,不允许带有必须一起处理的带有关联值的标志,显着减少了要准备的排列和组合的数量(所提供的String[]
中的每个字符串都独立于该数组中的所有其他字符串),并且最多只允许一个可选参数(并要求其为最后一个)。
随着命令行参数情况变得越来越复杂,我对使用第三方库的渴望也越来越高。 如果我想拥有多个可选参数,或者想要具有包含带有相关值的标志的选项,那么我更有可能跳到第三方库来解析Java中的命令行参数。 使用本系列中涵盖的大多数第三方库,无需我担心选项排序和选项名称/标志关联。
可能需要在Java中滚动自己的命令行解析代码的一种情况是,当这些解析需求高度特定于现有库无法很好地处理的特定情况时,或者当现有库中的任何一个都无法充分满足其需求时需要。 但是,如果有30多个库可用,我怀疑对于大多数人来说这种情况会经常发生。
在用Java开发自己的命令行解析代码时,除了从头编写代码之外,其他选择还包括派生和扩展一个开源库,或者在诸如“ 使用Java解析命令行参数 ”一文中介绍的框架上构建自己的代码。 :使用有效的Java框架编写命令行工具”(《 Java开发者杂志 》第20和22页)。
对于基于Java的小型工具,本文中显示的简单命令行解析方法通常就足够了,尤其是当我是唯一可能使用该工具的工具时。 但是,随着Java应用程序潜在用户群的增加,本文中概述的要求可能会变得繁重,并且使用本系列文章中涵盖的第三方库可能有助于创建更加用户友好的命令行参数经验。 对于最简单的基于Java的工具和应用程序,我也许可以摆脱自己的自制命令行解析代码。 但是,对于大多数重要的Java应用程序来说,第三方库会更有意义,因为它为最终用户提供了更大的灵活性和易用性。
其他参考
- Java教程:命令行参数
- ParseCmdLine.java
- 如何在Java中解析命令行参数?
- 解析Java命令行程序的参数
- Java中的命令行参数示例 (JavaTutoring.com)
- Java中的命令行参数 (TutorialsPoint示例)
- Java命令行参数解析器
- 命令行参数 (Java基础)
- Java中的命令行参数解析 (Wikipedia)
- 使用Java解析命令行参数 :使用有效的Java框架编写命令行工具( PDF )
翻译自: https://www.javacodegeeks.com/2017/10/java-command-line-interfaces-part-29.html
java登录界面命令