Java命令行界面(第12部分):CLAJR

第十二篇有关在Java中处理命令行参数的文章的特色库是带有Java Reflection的命令行参数 (CLAJR)。 该“库”是单个Java源文件( CLAJR-0.9.java ), 可从SourceForge下载 。 CLAJR的主页当前显示2006年版权日期,可下载的源zip文件CLAJR-0.9-src.zip的日期为2008年12月6日。尽管CLAJR近年来似乎在很大程度上不受支持,尽管我不太可能选择CLAJR在本系列中已经讨论过的一些用于处理Java代码的命令行参数的替代库中,我相信CLAJR值得一提。 即使有些人选择不使用它,CLAJR也有一些相当独特的特性使它变得有趣。

CLAJR未作为JAR提供。 而是以单个压缩文件的形式提供,该ZIP文件中包含单个Java源代码文件。 作为单个源代码文件提供不是CLAJR独有的。 Picocli也以单个Java源代码文件提供。 但是,Picocli还在Maven存储库(我在使用Picocli时使用的存储库)上提供了JAR,但是我不知道带有适用于CLAJR的.class文件的预构建JAR。 因此,由于在使用第三方库时,我比源代码文件更喜欢JAR,因此我在尝试CLAJR时所做的第一件事是将其提供的源代码构建到一个小的JAR文件中。

这是我使用CLAJR构建JAR的步骤(我必须对源文件进行一些更改,而该更改将在本文后面描述):

  1. 从SourceForge 下载 CLAJR-0.9-src.zip
  2. 解压缩CLAJR-0.9-src.zip以提取CLAJR-0.9.java
  3. 创建一个目录clajr来表示Java源类应位于其中的Java clajr包。
  4. CLAJR-0.9.java文件移动到clajr目录,并将其重命名为CLAJR.java以匹配该源文件中类的名称。
    • 我还必须编辑源代码以进行较小的更改; 这将在后面的文章中详细讨论。
  5. 使用javacCLAJR.java文件编译为多个类文件。
  6. 使用jar将已编译的.class文件组装成一个JAR(我将其命名为CLAJR-0.9.jar )。

以下两个屏幕快照说明了上述步骤。

本系列到目前为止所介绍的基于Java的命令行解析库倾向于使用注释或特定的编程API,以允许在Java代码中定义,解析和询问命令行参数。 顾名思义,CLAJR使用Java反射来定义要解析的预期参数。

CLAJR主页上描述了为什么作者选择对方法名称进行反思以定义命令行参数。 CLAJR寻找名称与要处理的一个或多个参数相对应的方法。 单下划线在单连字符命令行参数的方法名称之前,而双下划线在双连字符命令行参数的方法名称之前。 当多个命令行参数执行相同的操作时,可以将单个方法命名为与多个命令行参数对齐。

与本系列的其他文章一样,本文的示例演示了如何使用CLAJR库对--file / -f命令行参数和--verbose / -v命令行参数进行建模。 为了在CLAJR中“定义”这些参数,我需要将我的方法_f__file_v__verbose为与-f / --file-v / --verbose参数相对应。 下一个代码清单中的嵌套类Options的部分代码片段对此进行了演示。

CLAJR中的“定义”阶段:反思

/*** Used reflectively by CLAJR to parse and interrogate command line* options defined as fields in this class.*/
public static class Options
{private String file;private boolean verbose;public void _v__verbose(){verbose = true;}public void _f__file(String newFilePathAndName){file = newFilePathAndName;}

使用CLAJR进行解析仅需一个语句。 接下来的两行代码演示了如何调用静态CLAJR.parse(String[], Object...)并将上面部分显示的命令行参数和Options类的刚刚实例化的实例传递给它。

CLAJR中的“解析”阶段

final Options options = new Options();
CLAJR.parse(arguments, options);

在上面显示的单行分析中, parse方法没有返回值。 相反,传入的“选项”实例的字段根据在命令行上提供的参数填充。 CLAJR在“选项”实例的方法上使用反射,以找到在命令行上发现相应参数时要调用的方法。 正是Options这种实例,人们可以“询问”以在命令行上找到参数的值。 下一个代码清单对此进行了演示。

CLAJR的“审讯”阶段

out.println("File is '" + options.getFile() + "' and verbosity is set to '"+ options.isVerbose() + "'.");

CLAJR支持通过反思按方法提供帮助/使用信息。 在这种情况下,方法的命名方式与命令行参数本身的约定类似,但是在方法名称之前带有help 。 下一个代码清单中前面显示的参数的两种组合对此进行了演示。

CLAJR“帮助”方法

public String help_v__verbose()
{return "Enables verbosity of output.";
}public String help_f__file()
{return "Path and name of file.";
}

刚刚显示的代码清单中的方法为-v / --verbose-f / --file参数提供“帮助”字符串。 静态CLAJR方法CLAJR.getHelp()方法提供了一个String表示基于这些方法的命令行用法。 CLAJR提供了可以捕获的不同异常,这些异常通常与“帮助”方法结合使用。 在下一个代码清单中演示了这些内容,该清单显示了可以执行的与不同错误情况相关的多个捕获,以及其他保证显示错误信息的情况。

CLAJR的CLAJR.getHelp()和CLAJR异常

catch (CLAJR.EmptyArgumentListException emptyArgsEx)
{out.println("Usage: Main -f|--file  [-v|--verbose]");
}
catch (CLAJR.HelpNeededException helpNeededEx)
{out.println(CLAJR.getHelp());
}
catch (CLAJR.ParseException parseEx)
{out.println(parseEx.getMessage());out.println(CLAJR.getHelp());
}
catch (Throwable throwable)  // CLAJR.parse throws Throwable
{out.println(throwable.getMessage());
}

CLAJR 0.9的CLAJR.parse(String[], Object...)方法抛出Throwable ,因此上面的代码捕获了Throwable

接下来的三个屏幕快照展示了这个简单的示例。 第一张图片显示了没有提供参数时打印的用法。 第二张图描绘了定义,解析和询问命令行参数的正常流程。 第三个图像演示了在命令行上提供意外的参数时显示的帮助信息。

为了使示例CLAJR.java ,我必须更改CLAJR.java源文件。 具体来说,我将invoke(String, String, boolean, List)方法中的491行if (tails == null)更改为if (tails == null || tails.isEmpty()) 。 这是开源的优势之一; 可以根据需要调整或修复代码。

CLAJR允许以反射方式访问以单个下划线命名的方法。 此-方法对应于一个或多个“ tail”参数。 在本示例中,我没有使用它,但是有趣的是,这在JDK 9中不起作用,因为在JDK 9中不允许使用单个下划线作为标识符。实际上,JDK 8的javac现在就对此发出警告,如下所示。下一个屏幕快照。

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

  • CLAJR是开源的,并获得了GNU通用通用公共许可证 ( 2.1或更高版本)的许可 。
  • CLAJR是供下载作为包含单个文件CLAJR-0.9.java称为CLAJR-0.9-src.zip大约11 KB的zip文件。
  • CLAJR 0.9不需要下载任何第三方库。
  • CLAJR已经存在了一段时间,但似乎已经有几年没有更新了。 我必须对源代码进行微小的更改,以使其对我来说正常工作。

CLAJR是基于Java的命令行处理库,其主要用途是通过使用反射与本系列中介绍的其他库区分开。 反射用于定义预期的命令行参数以及与这些参数关联的帮助消息。 CLAJR提供了一些与Java命令行处理相关的独特思想和方法,但这是一个过时的库。

其他资源

  • CLAJR主页
  • CLAJR在SourceForge上下载

翻译自: https://www.javacodegeeks.com/2017/08/java-command-line-interfaces-part-12-clajr.html

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

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

相关文章

specs.4.8.gz_使用Specs2和客户端API 2.0进行富有表现力的JAX-RS集成测试

specs.4.8.gz毫无疑问, JAX-RS是一项杰出的技术。 即将发布的规范JAX-RS 2.0带来了更多的强大功能,尤其是在客户端API方面。 今天的帖子的主题是JAX-RS服务的集成测试。 有很多优秀的测试框架,例如REST,可以确保提供帮助&#xff…

了解OAuth2令牌认证

1.简介 在本教程中,我们将了解OAuth2令牌身份验证 ,以便只有经过身份验证的用户和应用程序才能获得有效的访问令牌,该令牌随后可用于访问服务器上的授权API(在OAuth术语中仅是受保护的资源)。 使用基于令牌的身份验证…

Java 9:好的,坏的和私有的接口方法

Java 9 是在几周前发布的。 查看发行说明 ,其中包含许多有趣的功能。 不过,我觉得并非一切都是不如甲骨文和Java行家似乎图片吧 。 我看到了Java世界中的三个趋势,分别是好,坏和丑陋。 让我们从好的开始。 Birdman(20…

PagingAndSortingRepository –如何与Thymeleaf一起使用

在本教程中&#xff0c;我将演示如何通过分页显示Thymeleaf中的企业客户列表。 1 –项目结构 我们有一个正常的Maven项目结构。 2 –项目依赖性 除了正常的Spring依赖关系之外&#xff0c;我们还添加Thymeleaf和hsqldb&#xff0c;因为我们使用的是嵌入式数据库。 <?x…

matlab里方差分析的盒子图怎么看,Matlab方差分析

Matlab 方差分析(T检验)在工农业生产和科学研究中,经常遇到这样的问题:影响产品产量、质量的因素很多,我们需要了解在这众多的因素中,哪些因素对影响产品产量、质量有显著影响.为此,要先做试验,然后对测试的结果进行分析.方差分析就是分析测试结果的一种方法.在方差分析中,把在…

使用Okta的单点登录保护您的Vert.x服务器

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Vert.x是Spring生态系统中增长最快的元素之一&#xff0c;保护Vert.x服务器可能是一个…

Apache Kafka简介

什么是Apache Kafka&#xff1f; Apache Kafka是一个分布式流系统&#xff0c;具有发布和订阅记录流的功能。 在另一方面&#xff0c;它是企业消息传递系统。 它是一个快速&#xff0c;水平可扩展和容错的系统。 Kafka有四个核心API&#xff0c; 生产者API&#xff1a; 该API允…

oracle查看存储过程最近编译,Oracle恢复被误编译覆盖的存储过程

同事在写Oracle存储过程时候&#xff0c;是在以前已经写好的过程基础上修改的&#xff0c;想换个名字&#xff0c;由于疏忽没有改名字就编译了&#xff0c;编译完才意识到。这时原来的那个已经没有了。找我想办法恢复回原来的那个过程。通过查资料想到个方法&#xff0c;也不知…

oracle安装 redo log file,Oracle Dump Redo Log File 说明

关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)使用一. dump redo 说明关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)…

unity 飞机 残骸模型_训练残骸模式– Java 8中的改进实现

unity 飞机 残骸模型Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容&#xff0c;如下所示&#xff1a; >someObject.method1().method2().method3().finalResult()很少有人会将此与构建器模式相关联&#xff0c;但事实并非如此。 无…

datastage配置oracle,IBM Datastage8.5配置问题

大家好&#xff0c;最近因学习需要&#xff0c;在虚拟机REHL5.5上安装了IBM Datastage8.5的服务器端&#xff0c;在windows端安装客户端&#xff0c;调试连接时&#xff0c;提示密码不正确&#xff0c;我修改了密码&#xff0c;重启了服务器&#xff0c;还是提示密码不正确&…

使用Spring @Transactional进行数据源路由

卡尔帕帕&#xff08;Carl Papa&#xff09;在Spring框架中使用方面来确定要使用的DataSource &#xff08;读写或只读&#xff09;启发了我。 所以&#xff0c;我正在写这篇文章。 我必须承认&#xff0c;我对Spring的AbstractRoutingDataSource早已熟悉。 但是我不知道在哪里…

linux设置新硬盘权限,Linux 下挂载新硬盘以及更改为普通权限

1、启动终端&#xff0c;以root用户登录2、查看硬盘信息&#xff1a;#fdisk -l3、进入磁盘&#xff0c;对磁盘进行分区&#xff1a;#fdisk /dev/sda(注意看你要挂载哪一个磁盘&#xff0c;我的是sda&#xff0c;有的是sdb)4、格式化分区&#xff1a;#mkfs.ext3 /dev/sda1 //注&…

使用Payara Micro的Easy Java EE Microservices

想知道如何开始使用Java EE Microservices&#xff1f; 使用Java EE API只需很少的步骤即可部署微服务。 许多人认为Java EE无法与微服务一起使用&#xff0c;但事实并非如此……特别是如果您仅使用服务所需的Java EE规范。 在这篇简短的文章中&#xff0c;我将演示如何使用Jav…

linux终端lex程序运行,lex的简单使用

Lex & Flex 简介Lex是lexical compiler的缩写&#xff0c;是Unix环境下非常著名的工具&#xff0c; Lex (最早是埃里克施密特和 Mike Lesk 制作)是许多 UNIX 系统的标准词法分析器(lexical analyzer)产生程式&#xff0c;而且这个工具所作的行为被详列为 POSIX 标准的一部分…

Linux内存page,Linux虚拟内存管理 - Page Table的作用

虚拟内存的作用&#xff1a;1.扩展实际有限的物理内存&#xff0c;当然这种扩展是虚拟的&#xff0c;比如物理内存512M&#xff0c;对于一个需要1G空间的进程来说&#xff0c;照样可以运行。这增加了操作系统是应用范围。2.使得进程中的数据空间增大&#xff0c;增大到多少与硬…

openoffice+linux+jodconverter+乱码,OpenOffice安装和转换乱码解决方案

前言&#xff1a;OpenOffice项目中用途&#xff1a;word转换pdfWindows安装、转换&#xff1a;安装包下载后一路OK就可以正常安装&#xff0c;转换没有问题Linux安装、转换&#xff1a;安装有分DEB包和RPM包&#xff0c;下面会说明各自安装方法在en_US.UTF-8 系统环境下会出现乱…

junit 参数化测试用例_JUnit:在参数化测试中命名单个测试用例

junit 参数化测试用例几年前&#xff0c;我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例&#xff0c;因此&#xff0c;如果它们失败&#xff0c;您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思&…

MX250和第三方Linux版区别,MX250和MX350哪个好一点,区别和差距在哪里?求推荐?_科技数码通...

MX350系列显卡使笔记本颜值变得更高&#xff0c;性能更强&#xff0c;更轻便&#xff0c;在轻便笔记本需求变得越来越大&#xff0c;但性能也要求越来越高&#xff0c;特别是在图像处理方面&#xff0c;这个时候MX系列的显卡便应运而生&#xff0c;其拥有者超低的功耗&#xff…

linux r包默认安装位置,R-Language(R语言或称r-project)的安装

1、R语言的简介R语言(r-project)是主要用于统计分析、绘图的语言和操作环境。2、配置yum源2.1、安装说明由于编译安装相对繁琐&#xff0c;故而安装使用repoforge的源解决&#xff0c;免去编译的麻烦。注意&#xff1a;请根据实际的系统OS版本选取合适的YUM源。2.3、rpmforge源…