Jast blog Jast blog
首页
  • 《Ambari自定义开发教程》笔记
  • 《CDH教程》笔记
  • 《ClickHouse教程》笔记
  • 《HDFS教程》笔记
  • 《DolphinScheduler教程》笔记
  • 《Hbase教程》笔记
  • 《Iceberg教程》笔记
  • 《Hive教程》笔记
  • 《Flume教程》笔记
  • 《Kafka教程》笔记
  • 《Impala教程》笔记
  • 《Hue教程》笔记
  • 《Spark教程》笔记
  • 《Flink教程》笔记
  • 《Phoenix教程》笔记
  • 《ElasticSearch教程》笔记
  • 《Kylin教程》笔记
  • 《Storm教程》笔记
  • 《Yarn教程》笔记
  • 《Presto教程》笔记
  • 《图数据库教程》笔记
  • 《Kerberos教程》笔记
  • 《Maxwell教程》笔记
  • 《MinIO教程》笔记
  • 《DataX教程》笔记
  • 《Superset教程》笔记
  • 《IOTDB教程》笔记
  • 《大数据相关》笔记
  • 《PaddleNLP教程》笔记
  • 《Nginx教程》笔记
  • 《Java技术文档》
  • 《Maven教程》笔记
  • 《IDEA使用教程》
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档

Jast-zsh

如果你知道你要去哪里,全世界都会给你让路。
首页
  • 《Ambari自定义开发教程》笔记
  • 《CDH教程》笔记
  • 《ClickHouse教程》笔记
  • 《HDFS教程》笔记
  • 《DolphinScheduler教程》笔记
  • 《Hbase教程》笔记
  • 《Iceberg教程》笔记
  • 《Hive教程》笔记
  • 《Flume教程》笔记
  • 《Kafka教程》笔记
  • 《Impala教程》笔记
  • 《Hue教程》笔记
  • 《Spark教程》笔记
  • 《Flink教程》笔记
  • 《Phoenix教程》笔记
  • 《ElasticSearch教程》笔记
  • 《Kylin教程》笔记
  • 《Storm教程》笔记
  • 《Yarn教程》笔记
  • 《Presto教程》笔记
  • 《图数据库教程》笔记
  • 《Kerberos教程》笔记
  • 《Maxwell教程》笔记
  • 《MinIO教程》笔记
  • 《DataX教程》笔记
  • 《Superset教程》笔记
  • 《IOTDB教程》笔记
  • 《大数据相关》笔记
  • 《PaddleNLP教程》笔记
  • 《Nginx教程》笔记
  • 《Java技术文档》
  • 《Maven教程》笔记
  • 《IDEA使用教程》
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
  • Freemarker模板使用
  • Java项目通过Log4j将日志发送到Kafka
  • Java Maven中自动代码检查插件
  • Protobuf详细介绍
  • 提升开发效率:JCommander高效Java命令行参数解析利器
    • 目录
    • 概述
    • 项目地址
    • JCommander 的安装
    • 快速开始
    • 参数类型的支持
    • 自定义参数的解析
    • 命令的支持
    • 参数验证与默认值
    • 使用参数文件
    • 国际化支持
    • 总结
  • 36k Star!Arthas Java开发者的故障排查利器
  • 高级单元测试中的 Mockito 使用指南
  • Java代码覆盖率工具
  • Jar包源码修改
  • 《Java技术文档》
Jast-zsh
2024-10-08
目录

提升开发效率:JCommander高效Java命令行参数解析利器

# 提升开发效率:JCommander高效Java命令行参数解析利器

# 目录

  1. 概述
  2. 项目地址
  3. JCommander 的安装
  4. 快速开始
  5. 参数类型的支持
  6. 自定义参数的解析
  7. 命令的支持
  8. 参数验证与默认值
  9. 使用参数文件
  10. 国际化支持
  11. 总结

# 概述

在日常开发中,我们经常需要通过程序入口传递参数。例如,假设你正在开发一个日志处理工具,运行时需要传入日志文件路径和日志级别:java -jar logprocessor.jar /var/logs/app.log DEBUG。**像这样直接依赖位置顺序的参数传递方式,不仅可读性差,一旦参数的顺序发生变化或者参数数量增加,维护起来也会变得非常麻烦。**而且,缺乏有效的参数校验机制,可能导致错误的输入未被及时发现,影响程序的运行。

JCommander 正是为了解决这些痛点而生。作为一个轻量级的 Java 命令行参数解析库,它让开发者能够通过注解将命令行参数直接映射到 Java 对象字段,提供了更清晰、易于管理的参数解析方式。相比于手动解析,JCommander 自动处理参数校验、默认值设置,并支持子命令和国际化等高级功能,极大简化了开发者的工作,让复杂的命令行应用更具灵活性和扩展性,减少了出错的风险。

# 项目地址

GitHub开源地址:https://github.com/cbeust/jcommander

开源协议:Apache License 2.0

# JCommander 的安装

要使用 JCommander,可以通过 Maven 来管理其依赖。将以下依赖添加到你的项目的 pom.xml 中:

<dependency>
    <groupId>com.beust</groupId>
    <artifactId>jcommander</artifactId>
    <version>1.82</version>
</dependency>
1
2
3
4
5

对于 Gradle,可以添加以下代码:

implementation 'com.beust:jcommander:1.82'
1

如果你使用的是纯 Java 项目,可以手动下载 jar 包并添加到类路径中。

# 快速开始

JCommander 的核心思想是将命令行参数映射到 Java 对象的字段上。使用 @Parameter 注解可以快速实现参数绑定。让我们通过一个简单的示例来了解如何解析命令行参数:

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;

public class MainArgs {
    @Parameter(names = "--name", description = "User's name")
    private String name;

    @Parameter(names = "--age", description = "User's age")
    private int age;

    public static void main(String[] args) {
        MainArgs mainArgs = new MainArgs();
        JCommander.newBuilder()
                  .addObject(mainArgs)
                  .build()
                  .parse(args);

        System.out.println("Name: " + mainArgs.name);
        System.out.println("Age: " + mainArgs.age);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

运行这个 Java 程序时,传入参数如 --name John --age 30,会打印出对应的结果:

Name: John
Age: 30
1
2

# 参数类型的支持

JCommander 默认支持多种数据类型的解析,包括:

  • 基本类型(如 int、double、boolean)
  • 字符串(String)
  • 集合类型(如 List<T> 和 Set<T>)

例如,要传递一个整型参数列表:

import com.beust.jcommander.Parameter;
import java.util.List;

public class ArgsList {
    @Parameter(names = "--numbers", description = "A list of numbers")
    private List<Integer> numbers;

    // getter and setter...
}
1
2
3
4
5
6
7
8
9

传入 --numbers 1 2 3 4,JCommander 会自动将它解析为 List<Integer> 类型。

# 自定义参数的解析

除了 JCommander 内置的类型外,开发者还可以自定义参数的解析器。你只需实现 IStringConverter<T> 接口,并在 @Parameter 注解中声明你的解析器。

import com.beust.jcommander.IStringConverter;
import com.beust.jcommander.Parameter;

class ColorConverter implements IStringConverter<Color> {
    @Override
    public Color convert(String value) {
        return new Color(value);
    }
}

public class CustomArgs {
    @Parameter(names = "--color", converter = ColorConverter.class, description = "A color parameter")
    private Color color;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

这里的 ColorConverter 实现了如何将字符串解析为 Color 对象。传入 --color red,程序会解析并使用该参数。

# 命令的支持

在复杂的 CLI 工具中,可能会有多个不同的命令,比如 git 工具中的 commit、push 等子命令。JCommander 支持通过子命令的方式来解析不同的命令和对应的参数。

import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter;

public class CommandArgs {
    public static class CommitCommand {
        @Parameter(names = "--message", description = "Commit message")
        private String message;
    }

    public static class PushCommand {
        @Parameter(names = "--remote", description = "Remote repository")
        private String remote;
    }

    public static void main(String[] args) {
        CommitCommand commit = new CommitCommand();
        PushCommand push = new PushCommand();

        JCommander jc = JCommander.newBuilder()
                                  .addCommand("commit", commit)
                                  .addCommand("push", push)
                                  .build();

        jc.parse(args);

        if ("commit".equals(jc.getParsedCommand())) {
            System.out.println("Committing with message: " + commit.message);
        } else if ("push".equals(jc.getParsedCommand())) {
            System.out.println("Pushing to remote: " + push.remote);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# 参数验证与默认值

JCommander 允许对传入的参数进行验证。你可以通过实现 IParameterValidator 接口,定义自定义的参数校验逻辑:

import com.beust.jcommander.Parameter;
import com.beust.jcommander.IParameterValidator;
import com.beust.jcommander.ParameterException;

class PositiveIntegerValidator implements IParameterValidator {
    @Override
    public void validate(String name, String value) throws ParameterException {
        int n = Integer.parseInt(value);
        if (n <= 0) {
            throw new ParameterException("Parameter " + name + " should be positive (found " + value + ")");
        }
    }
}

public class ValidatedArgs {
    @Parameter(names = "--port", validateWith = PositiveIntegerValidator.class, description = "Server port")
    private int port = 8080; // 默认值
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

上面的示例中,--port 参数必须为正数,否则程序将抛出 ParameterException。

# 使用参数文件

在某些场景下,参数数量可能非常多,用户可以选择将参数写入文件,并通过文件传递给程序。JCommander 支持这种方式:

@Parameter(names = "@file", description = "Path to parameter file")
private String parameterFile;
1
2

文件中的参数应按一行一个参数的方式书写,运行时通过 @file 读取。

# 国际化支持

如果你的命令行工具需要支持多语言,JCommander 提供了国际化支持。你可以在 @Parameter 中指定一个 resourceBundle,然后将描述信息放入资源文件中。

@Parameter(names = "--help", descriptionKey = "help")
private boolean help;
1
2

对应的 help 描述可以在资源文件 messages.properties 中定义:

help=显示帮助信息
1

根据不同的 Locale,加载相应的资源文件,JCommander 会自动解析并使用。

# 总结

JCommander 是一个简单、灵活且功能强大的命令行解析库,支持基本的参数解析、自定义类型、命令的支持以及国际化等高级功能。通过其简单的注解机制,开发者能够快速构建高效的 CLI 工具,从而提升开发效率。

上次更新: 2024/10/09, 21:00:17
Protobuf详细介绍
36k Star!Arthas Java开发者的故障排查利器

← Protobuf详细介绍 36k Star!Arthas Java开发者的故障排查利器→

最近更新
01
Linux可视化监控
02-26
02
Maven私服搭建
02-26
03
当ElasticSearch时间字段设置多个格式到底是用的哪个?
01-19
更多文章>
Theme by Vdoing | Copyright © 2016-2025 Jast-zsh | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式