Java命令行界面(第3部分):jbock

在本系列中有关使用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

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

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

相关文章

java 关闭串口_java – 打开和关闭串行端口

我正在尝试连接到Serial Port …但是一旦我第一次打开串行端口.我不能再打开它,我试着申请.这是我的代码&#xff1a;public static void main(String[] args) {portList CommPortIdentifier.getPortIdentifiers();while (portList.hasMoreElements()) {portId (CommPortIden…

java collection详解_java 7 collection 详解(一)

一、综述java集合框架定义了几个接口&#xff0c;这些接口决定了collection类的基本特性。不同的是&#xff0c;具体类仅仅是提供了标准接口的不同实现&#xff0c;如图&#xff0c;java集合框架接口图从图可知&#xff0c;java集合类的主要是由两个接口派生而出——Collection…

java导出pdf 含图片_java 生成PDF含图片和中文件实现代码

1,所需包 iText.jar iTextAsian.ar(支持中包)2,列子package com.pdf;import java.awt.Color;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.net.MalformedURLException;import javax.naming.spi.DirectoryManager;import com.l…

jsf tree组件_JSF:在传统组件和时尚性能杀手之间进行选择

jsf tree组件这篇博客文章起源于一个大型Web应用程序中的性能问题。 每个人都优化Java代码&#xff0c;但似乎没有人尝试优化JavaScript代码。 奇怪&#xff0c;因为在客户端有很多改进的空间。 我会说&#xff0c;甚至比服务器端还要多。 我们将分析可编辑的JSF标准组件&#…

java耗时操作阻塞_spring boot高并发下耗时操作的实现方法

高并发下的耗时操作高并发下&#xff0c;就是请求在一个时间点比较多时&#xff0c;很多写的请求打过来时&#xff0c;你的服务器承受很大的压力&#xff0c;当你的一个请求处理时间长时&#xff0c;这些请求将会把你的服务器线程耗尽&#xff0c;即你的主线程池里的线程将不会…

如何在Java中转义JSON字符串-Eclipse IDE技巧

在Java应用程序中工作或进行JSON解析时&#xff0c;通常很常见的做法是从某些资源&#xff08;例如RESTful Web服务&#xff09;中复制粘贴JSON字符串&#xff0c;然后使用Jackson库解析JSON。 这是测试和学习Java中解析JSON字符串的最快方法&#xff0c;但是这种方法的主要问题…

java hashmap实例_java HashMap详解及实例代码

java hashmap/** map集合的特点* 将键映射值的对象&#xff0c;一个映射不能包含重复的值&#xff1b;每个键最多只能映射到一个值** map集合和collection集合的区别&#xff1f;* map集合存储元素是成对出现的&#xff0c;map集合的键是唯一的&#xff0c;就是可重复的。可以把…

spring javafx_带有Spring的JavaFX 2

spring javafx我将从一个大胆的声明开始&#xff1a;我一直很喜欢Java Swing或applet。 在那里&#xff0c;我说了。 如果我进行一些自我分析&#xff0c;那么这种钦佩可能是在我接触Java时开始的。 Swing&#xff08;实际上&#xff09;是我使用Java所做的第一件事&#xff0c…

jframe和mysql登陆_刚写的一个从数据库读取账户和密码进行登陆的小程序~高手请无~...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.sql.Connection;import java.sql.DriverManager;import java.sql.*; import javax.swing.*;public class LoginSystem extends JFrame{publi…

使用WebCrypto API的电子签名

有时我们需要让用户进行电子签名。 通常&#xff0c;人们会理解为将您的手写签名以某种方式放在屏幕上。 根据管辖范围&#xff0c;可能很好&#xff0c;或者仅存储图像可能还不够。 例如&#xff0c;在欧洲&#xff0c;有910/2014号法规 &#xff0c;该法规定义了什么是电子签…

mycat mysql 物理部署_一、MyCat的搭建

一、什么是mycat简单直接点就是&#xff0c;MyCat其实就是一个数据库的中间件&#xff01;一般我们都是app直接到数据库&#xff01;有了MyCat以后&#xff0c;就是app到MyCat然后再访问数据库。mycat是个中间件&#xff0c;它负责连接管理mysql,应用程序连接mycat,把mycat当作…

java 记事本换行_[求助]记事本自动换行

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我编的一个记事本 自动换行该如何实现import java.io.*;import java.awt.*;import java.awt.event.*;import java.awt.print.*;public class Jishiben extends Frame implements ActionListener{FileDialog fileDlg;String str, f…

JAVA中的适配器应用_Java适配器模式应用之电源适配器功能详解

本文实例讲述了Java适配器模式应用之电源适配器功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一、模式定义存在两种适配器模式1 对象适配器模式&#xff0c;在这种适配器模式中&#xff0c;适配器容纳一个它包裹的类对象的物理实体。2 类适配器模式&#xff0c;…

java.util接口_函数接口– Java 8中java.util.function包中的函数接口

java.util接口我以前写过有关功能接口及其用法的文章。 如果您正在探索要成为Java 8一部分的API&#xff0c;尤其是那些支持lambda表达式的API&#xff0c;您会发现很少的接口&#xff0c;例如Function&#xff0c;Supplier&#xff0c;Consumer&#xff0c;Predicate和其他接口…

java new string作用_java中直接new String对象?

首先明确一点&#xff0c;在Java中比较的是两个对象的地址&#xff0c;equals()比较的是两个对象的值&#xff0c;如果使用equals()来替换&#xff0c;则两个输出结果都为true。言归正传&#xff0c;为什么第一个返回为false&#xff1f;先看一下intern()这个方法的描述&#x…

Apache Camel中的短重试与长重试

《骆驼设计模式》一书介绍了20种模式以及用于设计基于Apache Camel的集成解决方案的众多技巧和最佳实践。 每个模式都基于真实的用例&#xff0c;并提供了Camel特定的实现细节和最佳实践。 为了让您有这本书的感觉&#xff0c;以下是该书的重试模式摘录&#xff0c;其中介绍了如…

java注解的继承_Java注解合并,注解继承

spring中有时候一个类上面标记很多注解。实际上Java注解可以进行继承(也就是把多个注解合并成1个)比如说SpringMVC的注解RestControllerRequestMapping("/person")可以合并为一个PathRestController("/user")实现是&#xff1a;import java.lang.annotatio…

java实现驾校考试系统_jsp驾校考试系统

本驾校考试系统采用了Browser/Server体系结构&#xff0c;JSP(Java Server Page)作为前台开发工具&#xff0c;MySQL作为后台数据库进行开发。最终系统实现的系统将分为管理员和学员两个角色&#xff0c;其中系统管理员部分的主要功能包括修改登录密码、学员信息管理、科目1题目…

Java Maven和Gradle构建的主题缓存

Concourse CI 3.3.x引入了在任务运行之间缓存路径的功能。 此功能有助于加快将内容缓存在特定文件夹中的任务-在这里&#xff0c;我将演示如何使用此功能来加快基于Maven和Gradle的Java构建。 我在这篇文章中使用的代码和管道可以在我的github仓库中找到 – https://github.co…

java qlv转mp4 代码_怎么将qlv格式转换成mp4?教你快速转换视频格式的技巧

如何将qlv格式转换成mp4?众所周知qlv格式是腾讯视频的下载格式&#xff0c;而qlv格式的特点在于不能用别的播放器打开。如果用腾讯视频以外的播放器打开则需要将qlv格式转换成mp4&#xff0c;那你知道将qlv格式转换成mp4的技巧吗&#xff1f;下面小编教你一种转换qlv格式的技巧…