Java命令行界面(第2部分):args4j

在上一篇文章中 ,我研究了如何使用Apache Commons CLI在Java应用程序中解析命令行参数。 在本文中,我将使用另一个库args4j进行相同的操作。

args4j采用了一种不同于Commons CLI的方式来指定Java应用程序应期望的命令行参数。 尽管Commons CLI期望代表选项的对象将被单独且显式实例化,但args4j使用自定义注释来促进命令行参数处理的这一“定义”阶段。 命令行选项应该是类上的实例级字段,并带有@ org.kohsuke.args4j.Option批注。 每个命令行参数的特征都包含在此@Option注释的属性中。

本文中演示的简单应用程序与我上一篇文章中使用的应用程序相似,并着重于用于指定详细程度的可选且无值的-v选项,以及所需的-f选项,该选项期望代表文件路径和名称的值。 下一个代码清单演示了如何使用args4j的@Option注释将这些命令行参数设置为类数据成员上的注释。

args4j通过@Option注释定义命令行参数

@Option(name="-v", aliases="--verbose", usage="Print verbose status.")
private boolean verbose;@Option(name="-f", aliases="--file", usage="Fully qualified path and name of file.", required=true)
private String fileName;

如上面的代码清单所示,很容易指定选项的名称,用法以及是否需要(默认是可选的)。 上面的private修饰符的存在使它们很明显是在类级别定义的属性。 因为没有static修饰符,所以我们看到这些是已注释的实例变量。

要解析命令行选项,只需实例化一个CmdLineParser并将命令行参数传递给其parseArguments(String ...)方法:

解析args4j中的命令行参数

final CmdLineParser parser = new CmdLineParser(this);
try
{parser.parseArgument(arguments);
}
catch (CmdLineException clEx)
{out.println("ERROR: Unable to parse command-line options: " + clEx);
}

在刚刚显示的Java代码的第一行中, this是对类实例的引用,在该类实例中定义了上面显示的成员变量并使用@Option注释@Option注释。 在这种情况下,我使用this是因为定义这些选项的同一类是调用此解析方法的类。 为了在同一个类中执行此操作,我需要在类中定义一个名为doMain的实例(非static )方法,并由该类的main函数调用该方法(这在本文结尾处的完整代码清单中显示)。 从类的main(final String[])函数接收的命令行参数是传递给parseArguments(String[])方法的parseArguments(String[])数组。

接下来的两个屏幕快照演示了基于args4j的上述代码在解析命令行参数中的应用。 第一张图片显示了两个选项的短选项和长选项的组合。 第二个图像显示了自动报告未提供必需的命令行参数的情况。

命令行解析库的一个重要功能是能够显示用法或帮助信息。 下一个代码清单演示了使用args4j的CmdLineParser.printUsage(OutputStream)方法执行此操作的示例。

使用args4j打印使用情况信息

final CmdLineParser parser = new CmdLineParser(this);
if (arguments.length < 1)
{parser.printUsage(out);System.exit(-1);
}

下一个屏幕快照描述了args4j默认打印出的使用情况信息。

这篇文章演示了如何使用arg4j实现与Java应用程序中的命令行解析有关的一些最常见功能,包括选项“定义”,命令行参数“解析”,对所解析的命令行参数的“询问”以及帮助/ us与命令行参数有关的详细信息。 现在显示了上面在代码清单中部分表示的类的完整代码清单。

args4j演示Main.java的完整代码清单

package examples.dustin.commandline.args4j;import static java.lang.System.out;import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;import java.io.IOException;/*** Demonstrate args4j.*/
public class Main
{@Option(name="-v", aliases="--verbose", usage="Print verbose status.")private boolean verbose;@Option(name="-f", aliases="--file", usage="Fully qualified path and name of file.", required=true)private String fileName;private void doMain(final String[] arguments) throws IOException{final CmdLineParser parser = new CmdLineParser(this);if (arguments.length < 1){parser.printUsage(out);System.exit(-1);}try{parser.parseArgument(arguments);}catch (CmdLineException clEx){out.println("ERROR: Unable to parse command-line options: " + clEx);}out.println("The file '" + fileName + "' was provided and verbosity is set to '" + verbose + "'.");}/*** Executable function demonstrating Args4j command-line processing.** @param arguments Command-line arguments to be processed with Args4j.*/public static void main(final String[] arguments){final Main instance = new Main();try{instance.doMain(arguments);}catch (IOException ioEx){out.println("ERROR: I/O Exception encountered: " + ioEx);}}
}

这是在选择框架或库来帮助Java进行命令行解析时要考虑的args4j的一些其他特征。

  • args4j是开放源代码,并已获得MIT许可证 。
  • 当前版本的args4j( 2.33 ) 需要 J2SE 5 。
  • args4j不需要单独下载或引用任何第三方库。
  • args4j 2.33主JAR( args4j-2.33.jar )的大小约为152 KB。
  • Maven存储库显示了376个对args4j的依赖关系 ,包括OpenJDK的JMH Core和Jenkins (考虑到川口晃介的参与,这不足为奇)。
  • args4j已经存在了一段时间; 其2.0.3版本于2006年1月发布 ,至少从2003年开始就以某种形式出现。
  • args4j允许通过@Option注释上的“ hidden ”将命令行参数从使用情况输出中排除。
  • args4j允许指定和强制执行命令行参数之间的关系。 这包括指定何时不能同时提供两个参数的能力(“ 禁止 ”),以及仅当还提供了另一个参数时(“ depends ”)才有意义的情况。
  • args4j支持在有限的一组值适用于该选项的情况下使用枚举类型的类属性。 @Option文档在“枚举开关”部分下说明了如何执行此操作。
  • args4j通过其OptionHandler类提供了命令行参数解析的可扩展性和可定制性。

args4j库易于使用,并允许高度可读的代码。 决定是否使用args4j时,最大的考虑因素可能是确定使用批注指定命令行参数定义的舒适程度。

其他参考

  • args4j
  • args4j下载
  • args4j源代码 (GitHub)
  • args4j API文档
  • args4j样本主

翻译自: https://www.javacodegeeks.com/2017/06/java-command-line-interfaces-part-2-args4j.html

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

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

相关文章

mysql my.cnf在哪里_my.cnf配置文件在哪

my.cnf配置文件在linux上是位于路径“/etc/my.cnf”下&#xff0c;在window上则位于安装目录的根目录下&#xff1b;可以使用命令“mysql --help”查看关于MYSQL对应配置文件“my.cnf”搜索顺序。一般linux上都放在 /etc/my.cnf ,window 上安装都是默认可能按照上面的路径还是没…

深入学习Mybatis框架(二)- 进阶

1.动态SQL 1.1 什么是动态SQL&#xff1f; 动态SQL就是通过传入的参数不一样,可以组成不同结构的SQL语句。 这种可以根据参数的条件而改变SQL结构的SQL语句,我们称为动态SQL语句。使用动态SQL可以提高代码重用性。 1.2 XML方式的实现 1.2.1 需要使用到的标签 <if> 用于判…

近似线性依靠matlab_不要仅仅依靠单元测试

近似线性依靠matlab当您构建一个复杂的系统时&#xff0c;仅仅测试组件是不够的。 这很关键&#xff0c;但还不够。 想象一下一家汽车厂生产和进口最高质量的零件&#xff0c;但组装好汽车后再也没有启动发动机。 如果您的测试用例套件几乎不包含单元测试&#xff0c;那么您将永…

戏说 .NET GDI+系列学习教程(三、Graphics类的方法的总结)

转载于:https://www.cnblogs.com/WarBlog/p/11157395.html

从关系数据库到Elasticsearch的索引数据– 1

Elasticsearch提供强大的搜索功能&#xff0c;并支持数据的分片和复制。 因此&#xff0c;我们希望将数据库中可用的数据索引到Elasticsearch中。 有多种方法可以将数据索引到Elasticsearch中&#xff1a; 使用Logstash将源设置为DB&#xff0c;将接收器设置为Elasticsearch&…

mysql 求bit 某位为1_mysql按位的索引判断值是否为1

DELIMITER $$DROP FUNCTION IF EXISTS value_of_bit_index_is_true$$/*计算某个数字的某些索引的位的值是否都为1&#xff0c;索引类似1,2,3,4*/CREATE FUNCTION value_of_bit_index_is_true(number INT, idxies VARCHAR(50)) RETURNS INT(11)BEGIN/*将1,2,3,4,5,6这样的字符串…

python math.asin

import mathmath.asin(x) x : -1 到 1 之间的数值。如果 x 是大于 1&#xff0c;会产生一个错误。 #!/usr/bin/pythonimport math print "asin(0.64) : ", math.asin(0.64)print "asin(0) : ", math.asin(0)print "asin(-1) : ", math.asin(-1)p…

消息队列mysql redis那个好_Redis与RabbitMQ作为消息队列的比较

简要介绍RabbitMQRabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种&#xff0c;最初起源于金融系统&#xff0c;用于在分布式系统中存储转发消息&#xff0c;在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦&#xff0c;消息的发送者无需…

mysql 添加远程连接_为 mysql 添加远程连接账户

1、以管理员身份登录mysqlmysql -u root -p2、选择mysql数据库use mysql3、创建用户并设定密码create user [email protected] identified by ‘123456‘4、使操作生效flush privileges5、使操作生效flush privileges6、用新用户登录mysql -u test -p允许用户从远程访问数据库的…

包装类型与包装类别_包装的重要性

包装类型与包装类别我记得大约15年前开始学习Java的时候。 我读到了很多有关“包装”和“命名空间”的东西&#xff0c;但我完全不了解。 可悲的是&#xff1a;虽然包装的某些方面几乎为行业中的每个人所了解&#xff0c;但其他方面却不是。 因此&#xff0c;让我们看一下哪些软…

isinstance和issubclass

目录 一、isinstance与type二、issubclass一、isinstance与type 在游戏项目中&#xff0c;我们会在每个接口验证客户端传过来的参数类型&#xff0c;如果验证不通过&#xff0c;返回给客户端“参数错误”错误码。 这样做不但便于调试&#xff0c;而且增加健壮性。因为客户端是可…

animation动画不生效_你可能不知道的Animation动画技巧与细节

引言在 web 应用中&#xff0c;前端同学在实现动画效果时往往常用的几种方案&#xff1a;css3 transition / animation - 实现过渡动画setInterval / setTimeout - 通过设置一个间隔时间来不断的改变图像的位置requestAnimationFrame - 通过一个回调函数来改变图像位置&#xf…

eclipse查看jar包源代码

方法一&#xff1a;将jd-gui集成在Eclipse中 https://jingyan.baidu.com/article/b24f6c8275536686bfe5daed.html 下载2个反编译文件&#xff0c;实际操作未解决 https://www.cnblogs.com/jianshuai520/p/9267273.html 反编译器的位置&#xff0c;发生改变 方法二&#xf…

微服务系列:MicroProfile和Apache TomEE

介绍 MicroProfile是一项由知名供应商于2016年9月发起的举措&#xff0c;目的是基于JEE平台构建微服务架构。 任务是针对微服务架构优化Enterprise Java 。 开发人员可以利用这种体系结构&#xff0c;通过Enterprise Java平台以标准化的方式构建和开发微服务应用程序。 API构建…

crash recovery mysql_InnoDB crash recovery 完整过程

mysql Innodb在发生意外宕机&#xff0c;重启之后&#xff0c;要经历哪些过程&#xff0c;以下是详细过程。• Tablespace discoveryTablespace discovery is the process that InnoDB uses to identify tablespaces that require redo log application. See Tablespace Discov…

Java –远景JDK 8

世界正在缓慢但肯定地发生变化。 在进行了更改之后&#xff0c;使Java有了JDK 7的全新外观&#xff0c;Java社区期待JDK 8以及JDK 9附带的其余改进。 JDK 8的目标目的是填补JDK 7实施中的空白-该实施中剩下的部分难题&#xff0c;应该在2013年底之前为广大读者所用&#xff0c…

python三大结构、顺序结构_Python学习笔记3——三大结构:顺序,分支,循环3

顺序自上而下&#xff0c;依次执行分支分支的基本语法if 条件表达式&#xff1a;语句1语句2语句3......条件表达式就是计算结果必须为布尔值的表达式表达式后面的冒号不能少注意if后面的出现的语句&#xff0c;如果属于if语句块&#xff0c;则必须同一个锁紧等级条件表达式结果…

网络布线和数据转换

T568A 白绿 绿 白橙 蓝 白蓝 橙 白棕 棕 T568B 白橙 橙 白绿 蓝 白蓝 绿 白棕 棕 同种设备用交叉线 不同设备用直通线相连 PC与路由器为同种设备 交换机自成一派 转载于:https://www.cnblogs.com/qingqing1/p/11166632.html

Java 9模块系统(拼图)@ LJC的HackTheTower

今天&#xff0c;我们花了半天时间参加了第一次HackTheTower活动。 伦敦的Java用户组&#xff08;aka LJC &#xff09;的成员应伦敦市的邀请&#xff0c;聚集在伦敦市SalesForceTower&#xff08;aka Heron Tower &#xff09;26楼。 Heather VanCura是Java社区流程的主席 马…

在命令行下对ntfs分区文件夹权限的设置

随着Windows XP/Server 2003的流行&#xff0c;越来越多的用户开始选择NTFS文件系统&#xff0c;NTFS的好处自然是大大增强了系统的安全性&#xff0c;在“安全”标签页下&#xff0c; 我们可以在这里为不同级别的用户设置相应的访问控制权限&#xff0c;包括完全控制、修改、读…