Java 程序的命令行解释器

前几天我写了一个简单的词法分析器项目:https://github.com/MarchLiu/oliva/tree/main/lora-data-generator 。
通过词法分析快速生成 lora 训练集。在这个过程中,我需要通过命令行参数给这个 java 程序传递一些参数。

这个工作让我想起了一些不好的回忆。我这些年来做过太多类似的东西,随着程序开发的进展,命令行参数的规则越来越复杂,于是简单的几个赋值操作迅速变成了一大堆逻辑分支。

对于 Python 程序,至少内置的命令行解释工具 argparse 足够好用,对于通常
的开发工作已经足够。但是 Java 标准库中并没有这样的组件。

目前我所知道的,apache commons cli 或许是个好选择。但是我也有一些自己特定的期待:

  • 我希望有一个能够很方便的和 jaskell try 机制良好配合的工具
  • 希望它的构造足够方便
  • 对我常用的命令行设计风格有足够的支持,具体的内容后面我会介绍

于是,我顺手在 jaskell-rocks 库中加入了一个 ArgParser 工具,用于处理以下的命令行设计:

  • option: 可以指定 --xxx 类型的参数,这类参数需要带有参数值
    • option 可以有默认值
    • option 可以是 required 或者可选的
    • option 可以设置为只能在某几个值中选择
    • 允许多次传入同一个 option 名的参数,所有同名 option 的参数聚合为一个集合
  • with option:with option 不需要带有值,
    • 可以通过 --with-xxx 或 --without-xxx 表示某个 with option 是否设定
    • with option 有默认值,但是没有 required 限制
  • switch 开关
    • 开关有默认值
    • 可以通过 --enable-xxx 或 --disable-xxx 表示一个 switch 的状态
    • switch 有默认值
    • switch 有 required 或可选的状态
  • args
    • 前面介绍的三类都是有显式参数名的参数项,在其后可以有零到多个无名参数
    • 这些参数可以隐含有 require 约束,例如复制操作必须要提供 source 和 target,args 的 size 就至少需要为 2
    • args 参数也有可能有默认值,例如一个连接http服务的调试脚本可能默认连接 localhost:8080 ,没必要显式给出。
    • 显然,required args 应该在 所有 args 的最前面,而有默认值的应该在最后
  • help 所有显式设定的参数都允许提供 help 文本,argParser 内置对 --help-h 的识别,输出参数的文档
  • 允许为参数名设置缩写,例如 --source 可以设定为 -s

目前的 ArgParser 已经完全满足我的需要,例如 oliva 的 lora 数据生成工具,就使用了这个命令行解释器:

        var lexer = new LexerRouter();var source = Option.create("source").help("source project directory").required(true);var target = Option.create("target").help("where save lora train dataset").required(true);var argParser = ArgParser.create().header("Oliva is a assistant program. It just cut source code to lora training data.").formatter("%1$-20s %2$-20s %3$-60s\n").option(source).option(target).footer("Power by Jaskell");argParser.parse(args).onFailure(err -> {System.err.println(err.getMessage());}).onSuccess(result -> {result.autoHelp();//...

这里就是 lora-data-generator 项目的参数解析部分。如果传入了 help 参数,autoHelp 会向控制台打印帮助然后 System.exit(0) 退出。如果
需要深度的控制help行为,这个解释器还暴露了几个与帮助文档有关的中间方法,包括帮助格式的模板字符串。这个工具已经初步满足了我的需要,在未来,也
许我会加入一些便利的工具方法,类似 intValue 这种。但是总的来说,这个设计不需要再有大的改动,如果真的遇到在结构上不能满足我的需求,也许我会
考虑 apache commons cli。

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

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

相关文章

对Arthas-Trace命令的一次深度剖析,竟发现...

前言:此文仅为笔者学习Arthas源码的一次尝试,不对本文结论负全部责任。 一、背景 笔者在学习arthas这个十分方便的小工具的过程中,发现: 目前据arthas官方解释:因为trace多层是十分消耗资源的,因此trace命…

【期刊出版征稿】2024年艺术、教育和管理国际学术会议(ICAEM2024)

2024年艺术、教育和管理国际学术会议 2024 International Conference on Arts, Education and Management(ICAEM2024) 2024年艺术、教育和管理国际学术会议(ICAEM2024)将于2024年2月02-04日在马来西亚-吉隆坡召开。会议主题主要…

跨境助手:提升跨境电商卖家运营效率的利器

在如今全球化的商业环境中,跨境电商成为越来越多卖家追逐的商机。然而,对于新手卖家来说,跨境电商的复杂性和竞争激烈的市场环境可能会成为入坑的风险。如何降低风险、提高运营效率成为卖家们关注的焦点。而跨境助手作为一款专为跨境电商卖家…

Python Pandas 如何增加/插入一列数据(第5讲)

Python Pandas 如何增加/插入一列数据(第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹…

Spring Boot JSON中文文档

本文为官方文档直译版本。原文链接 Spring Boot JSON中文文档 引言Jackson自定义序列化器和反序列化器混入 GsonJSON-B 引言 Spring Boot 提供与三个 JSON 映射库的集成: GsonJacksonJSON-B Jackson 是首选的默认库。 Jackson Spring-boot-starter-json 提供了…

Python实现冰墩墩

目录 一、运行效果 图片效果 二、项目概述 三、开发环境 四、实现步骤及代码 1.导入需要的库。 2.完成剩余部分代码。 五、项目总结 六、源码获取 一、运行效果 图片效果 二、项目概述 这个项目使用了turtle库绘制了一个编程乐学的Logo。Logo中包含了一个笑脸&#xf…

64道Go机制高频题整理(附答案背诵版)

如何解决Golang uint 类型溢出问题? Golang的uint类型溢出问题通常会在大量运算中发生,特别是在涉及到大量循环或者大数运算时。当uint类型的值超过其最大值时,它会发生溢出,然后从该类型的最小值开始循环。为了解决这个问题&…

SpringBoot接入轻量级分布式日志框架GrayLog

1.前言 日志在我们日常开发定位错误,链路错误排查时必不可少,如果我们只有一个服务,我们可以只简单的通过打印的日志文件进行排查定位就可以,但是在分布式服务环境下,多个环境的日志统一收集、展示则成为一个问题。目…

基于CNN+数据增强+残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)+数据集+模型(一)

系列文章目录 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型(一) 基于CNN数据增强残差网络Resnet50的少样本高准确度猫咪种类识别—深度学习算法应用(含全部工程源码)数据集模型&#xf…

1U、2U、4U和42U服务器,看完秒懂!

晚上好,我的网工朋友。 服务器是一个很广泛的概念,涵盖了各种类型和规格的计算机,用于提供各种网络和数据服务。 而机架服务器是当前数据中心和专业计算环境中,使用最为广泛的服务器类型之一。 机架式服务器的外形看来不像计算…

C++面试宝典第7题:重载自增自减运算符

题目 编程实现一个自定义类CMyInteger,它重载了前缀和后缀形式的++和--操作符。同时,CMyInteger类还有一个Print成员函数,用于输出内部成员变量的值。完成该类后,下面使用CMyInteger的代码应能够编译通过,并得到与内置整形int相同的效果。 int main() {CMyInteger mi1(10…

考研英语一图表作文必背模版句

英语一的作文还是很靠日常积累的,依据潘赟老师的九宫格理论: 2——图画描述5——意义论证8——建议措施 这3个模块式最为核心也是最容易拉开分差的,对于时间有限的同志不建议忙下功夫浪费时间,而对于另外6个模块,还是…

Flink系列之:自定义函数

Flink系列之:自定义函数 一、自定义函数二、概述三、开发指南四、函数类五、求值方法六、类型推导七、自动类型推导八、定制类型推导九、确定性十、内置函数的确定性十一、运行时集成十二、标量函数十三、表值函数十四、聚合函数十五、表值聚合函数 一、自定义函数 …

java IO流-处理流

1、缓冲流 BufferedReader是最好用的文本读入方式其它的不常用,了解一下就行。 带有缓冲区的数据流,大概意思就是会把你要的数据读取完成之后一次发给你。 BufferedInputStream BufferedInputStream in new BufferedInputStream(new FileInputStream(n…

Android 13 - Media框架(22)- ACodec(四)

前面两节我们了解了 ACodec 的创建及配置流程,配置完成后 ACodec 进入了 LoadedState,这一节开始将会了解 ACodec 的启动过程。 调用 ACodec::initiateStart 方法发出的 kWhatStart 消息将有 LoadedState 状态来处理,这个方法会向 OMX 组件发…

【深度学习目标检测】八、基于yolov5的抽烟识别(python,深度学习)

YOLOv5是目标检测领域一种非常优秀的模型,其具有以下几个优势: 1. 高精度:YOLOv5相比于其前身YOLOv4,在目标检测精度上有了显著的提升。YOLOv5使用了一系列的改进,如更深的网络结构、更多的特征层和更高分辨率的输入图…

Git及Linux命令介绍

Git介绍 Git 命令如何工作 首先,必须确定我们的代码存储在哪里。常见的假设是只有两个位置 - 一个位于 Github 等远程服务器上,另一个位于我们的本地计算机上。然而,这并不完全准确。 Git 在我们的机器上维护了三个本地存储,这意…

Linux-----12、时间日期

# 时间日期 # 时区设置 在Linux (opens new window)系统中,默认使用的是UTC时间。 即使在安装系统的时候,选择的时区是亚洲上海,Linux默认的BIOS时间(也称:硬件时间)也是UTC时间 (opens new window)。 在…

关于C#反射概念,附带案例!

反射 C#中的反射是一种使程序在运行时能够动态地获取类型信息并调用其成员的技术。通过反射,程序可以在运行时进行类型的动态加载、创建对象、调用方法和属性,以及访问和修改字段等。反射可以使程序更加灵活,但也增加了一定的性能开销。 在C#…

90%的人学Python爬虫都干过这种事,别不承认!

可以说,我是因为想批量下载一个网站的图片,才开始学的python爬虫。当一张一张图片自动下载下来时,满满的成就感,也满满的罪恶感……哈哈哈!!!窈窕淑女,君子好逑,这篇文章…