Java 命令行界面:观察

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(139)   2024-03-29 06:20:40

这个关于在 Java 中解析命令行参数的系列文章由四个月内发布的 29 篇博文组成,涵盖了 28 个可用于在 Java 中解析命令行参数的不同开源库。这篇博文收集了本系列前 29 篇博文中的一些观察结果,并提供了一些在选择 28 个库中的一个或决定推出自己的命令行参数解析代码时要考虑的一般注意事项。尽管没有一个库可以最适合所有情况,但这篇文章还将研究某些库如何比其他库更适合特定情况。该帖子将以原始 28 个图书馆的子集结束,根据帖子中涵盖的某些标准,这些图书馆可能是涵盖的图书馆中最普遍吸引人的。

一般观察

查看本Java 命令行参数解析系列 中涵盖的 28 个库后,可以得出几个总结。

  • 对于大多数情况下的大多数 Java 开发人员来说,似乎没有什么理由编写自定义命令行解析代码。
  • 用于解析命令行参数的大量基于 Java 的库表明 Java 生态系统的广阔性。
  • 涵盖的所有 28 个库都是开源的,这一事实提醒我们开源在 Java 文化中的重要性。
  • 本系列中介绍的库之间存在一些有趣的差异,各种不同的方法提醒人们,通常有不止一种方法可以在 Java 中实现即使是相对次要的功能。
  • 在 Java 中有大量用于解析命令行参数的库,其中许多库都与作者声明有关现有库不能满足其需求的说法相关联,这证明不太可能永远存在单一语言、框架、或对每个人都“最好”的图书馆。如果像命令行解析库这样简单的东西不能写成每个人都喜欢,那么似乎不可能有更大的库、框架或编程语言成为每个人的最爱。在谈到库、框架和编程语言时,“不能一刀切”。
  • 在评估和选择图书馆时,不仅要考虑技术实力,还要考虑技术实力;它的许可证、分发机制、货币、供应商支持和社区支持也都影响了这个决定。甚至它将运行的 Java 版本也会影响决策。

评估标准

在众多库之间进行选择以及权衡是使用库还是实现自己的命令行参数功能时,这些标准对于 Java 开发人员来说可能很重要。

  • 它是开源的吗?
    • 在这种情况下,我对开源的简单定义是“使用该库的开发人员可以合法地查看源代码”。 Wikipedia 阐明了一个类似但稍微严格的定义,“[开源代码] 是源代码 [即] 提供的许可证,版权持有者提供研究、更改和分发的权利为任何目的向任何人提供软件。”
    • 本系列中涵盖的所有 28 个库都向使用该库的开发人员提供源代码,因此根据我的简单定义,它们都是“开源”的,而且通常也符合维基百科上稍微严格的定义。
  • 它的许可证是什么?
    • 每个库的颁发许可对于决定是否选择该库具有重要意义。大多数用户对明确定义且允许的内容最自由的开源许可证最为满意。
    • 本系列中涵盖的许多库都是在自由开源许可下发布的,但有些是在不太自由的许可下发布的,或者根本没有明确指定的许可。
  • 它的大小是多少?
    • 库的使用通常意味着类路径上有一个额外的 JAR,在某些情况下,对于特定的部署环境来说,使这些额外的库的大小尽可能小可能很重要。
    • 与 Spring 和 Hibernate 等库相比,这些命令行解析库都不大,但这些库之间的相对差异可能很大。
  • 是否存在第三方依赖项?
    • 第三方库增加了库大小的整体增加,意味着需要管理更多依赖项。
    • 本系列中涵盖的大多数库没有额外的依赖项,但其中一些库有。
  • 分配机制是什么?
    • 通过 Maven 存储库作为单个 JAR 的可用性可能是大多数 Java 开发人员获取库的最简单机制。
    • Maven 存储库中提供了许多涵盖库的 JAR,但有些库需要从项目站点或相关文章站点下载 JAR。
    • 本系列中涵盖的 28 个库倾向于通过 Maven 存储库、通过项目页面下载(GitHub、SourceForge、库作者站点等)进行分发,甚至在某些情况下进行复制和粘贴,其中“库是单个 Java 源代码文件。
  • 文档
    • 本系列中涵盖的库以多种方式记录,包括项目文档、Javadoc 文档、单元测试和代码内注释。
    • 许多库都有相当于“快速入门”教程的内容,但除此之外,有些库的文档相对较少。有些没有或只有很少的 Javadoc 注释,而另一些则有重要的基于 Javadoc 的 API 文档。许多库在线提供其 Javadoc 生成的文档,但有些库需要下载库才能查看其基于 Javadoc 的文档。
  • 社区
    • 对于开源项目,拥有一个使用该产品的大型社区通常是有利的,因为大型社区意味着更多的隐性测试以及可能更多关于如何使用该项目的博客文章、文章和论坛消息。
    • 本系列中涵盖的图书馆社区的规模差异很大,很难确定任何给定社区的规模。但是,依赖给定图书馆的图书馆数量和讨论给定图书馆的在线资源数量让我们了解社区参与。
  • 图书馆时代/最近更新
    • 更新并不总是更好,但与使用多年未更新或更改的产品相比,使用接收当前和最新更新的开源产品通常更具吸引力。对于小型和简单的库(例如命令行解析库)来说,问题不大,但目前支持的库仍然比可能被放弃的项目更有优势。
  • 它提供哪些功能?
    • 这是本系列中涵盖的库真正与众不同的地方,但这是库之间最难比较的标准,因为它实际上取决于所需的特定功能。
    • 大多数涵盖的库都提供了本系列简单示例中涵盖的大部分功能。但是,一些库提供的重要功能超出了每个库示例中使用的功能。
    • 对于整个系列中使用的简单示例,解析库提供的 API 的易用性可能与任何功能一样重要。

picocli GitHub 页面 上的CLI 比较页面 比较和对比了本系列中涵盖的许多库和本系列中未涵盖的一些库。该页面通过列出每个库的各自属性(例如许可证、支持的最低 Java 版本、API 样式和支持的解析选项)以表格形式比较库。

本系列涵盖了 28 个不同的库,用于解析 Java 的命令行参数。为此,不可能将其中任何一个指定为所有情况下所有人的“最佳”图书馆。每个库都是其开发人员(或多个开发人员)投入的时间和精力,但我在这里尝试将库列表缩小到我认为最有可能吸引一般情况和开发人员的子集。

投票最有可能成功

以下库按字母顺序列出,而不是按我的偏好顺序列出。

  • Apache Commons CLI
    • 在我看来,Apache Commons CLI 提供了这个缩小的推荐库子集中最不美观的 API。
    • Apache Commons CLI 受益于名称知名度、被其他库和产品频繁使用以及存在了很长时间。
      • 在难以证明安装新库的环境中,与大多数其他库相比,Apache Commons CLI 已经可用的可能性更大。
    • Apache Commons CLI 内置于 Groovy 中,因此对于在 Groovy 和 Java 之间切换的人来说特别容易使用。
    • 质量文档。
    • Apache 许可证第 2 版是一个广为人知、自由且对企业友好的许可证。
  • args4j
    • args4j 提供众多功能并且具有高度可扩展性。
    • 键入命令行参数。
    • 质量文档。
    • args4j 目前在开源 Java 社区中得到一个熟悉的名称的支持。
    • MIT 许可证是一个众所周知的、自由的、对公司友好的许可证。
  • JCommander
    • API 由易于使用的注释和构建器组合组成。
    • 键入命令行参数。
    • 质量文档。
    • JCommander 目前在开源 Java 社区中得到一个熟悉的名称的支持。
    • Apache 许可证第 2 版是一个广为人知、自由且对企业友好的许可证。
  • JewelCli
    • JewelCli 的注释界面方法很吸引我。
    • 键入命令行参数。
    • 质量文档。
    • Apache 许可证第 2 版是一个广为人知、自由且对企业友好的许可证。
  • 皮科利
    • 高度可读的基于注解的 API。
    • 质量文档。
    • 键入命令行参数。
    • 本系列中介绍的功能更丰富的库之一。
    • 目前支持(自从我开始写这一系列文章以来,已经通过几个新功能得到增强)。
    • Apache 许可证第 2 版是一个广为人知、自由且对企业友好的许可证。

虽然我列出了 28 个涵盖的库中的五个库的子集,但开发人员可能会选择使用不在这个缩小列表中的 23 个库之一是有原因的。一些不在此列表中的库提供了独特的功能,如果对 Java 开发人员足够重要,这些库将比上面列出的 5 个库更受欢迎。

下一个列表将一些涵盖的库与它们的一些相对独特的优势相关联。可能会选择其中之一,即使它不在我刚刚强调的五个列表中,如果它是特别和独特的强项并且是相关应用程序最重要的考虑因素之一。许多列出的“特征”是偏好或品味的问题,这意味着具有所列特征的库可能被一个开发人员视为积极的,而被另一个开发人员视为消极的。

特质 描述/好处 具有所需特征的库
颜色语法 颜色语法(选择环境) 皮科利
命令完成 自动完成命令(选择环境) 皮科利
配置(注解) 主要使用注释来定义命令行选项。 Airline 2 args4j cli-parser CmdOption 命令行 google -选项 jbock JCommander JewelCli MarkUtils-CLI picocli 滚
配置(API) 使用编程 API(传统和/或构建器)来定义命令行选项。 Apache Commons CLI Argparse4j argparser CmdLn getopt4j Jargo JArgp JArgs JCLAP jClap JOpt Simple JSAP jw-options 解析命令
配置(反射) 使用反射(但不是注释)来定义命令行选项。 CLAJR
配置(XML) 使用或支持使用 XML 来定义命令行选项。 JCommando JSAP
单一文件源 可以轻松地将“库”作为编译后的源代码文件而不是编译源代码的 JAR 包含在项目中。 CLAJR 皮科利
小罐子 库提供大小小于 25 KB 的最低要求的 JAR(适用于本系列中涵盖的版本)。 CLAJR cli-parser getopt4j JArgp JArgs jClap jw-options Rop

人们可能希望基于 Java 的命令行解析库具有许多其他特性,这些特性可能会缩小合适候选者的数量。这些包括命令样式的灵活性(长名称和/或短名称、样式 [GNU、POSIX、Java 等])、适用许可证、当前支持的可用性、新版本和更新、用户社区的规模以及 Java 的最低版本这是支持的。前面引用的Java 命令行解析器比较 中提供的表格可以很容易地比较本系列中涵盖的大多数库的其中一些特征。

这个关于使用 Java 解析命令行参数的系列 已经演示了 28 个库,还有几个公开可用的库未在本系列中介绍。有超过 30 个可用的库,大多数开发人员应该能够找到一个外部库来满足自己的需要。

其他参考资料

  • 用于解析命令行参数的 Java 库? [关闭]
  • 如何在 Java 中解析命令行参数?
  • Java 的最佳 CLI 解析器 [重复]
  • 我应该使用什么库来处理我的 Java 程序的 CLI 参数?
  • Java 命令行解析器比较
标签2: Java教程
地址:https://www.cundage.com/article/jcg-java-command-line-interfaces-part-30-observations.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...