Args4j的使用

Posted1 by 呼延十 on April 1, 2019 Hot:

背景介绍

项目中使用了Args4J来管理命令行参数.所以我来学习一下,做个Demo,了解其基本使用方式.

项目简介

简介

args4j is a small Java class library that makes it easy to parse command line options/arguments in your CUI application.

github仓库

https://github.com/kohsuke/args4j

官网

http://args4j.kohsuke.org/

主要特点

  • 通过注解使得命令行解析更加容易。

  • 生成使用介绍更容易。

  • 生成的HTML、XML文档包含了所有选项说明。

  • 完全本地化支持。

  • 选项风格类似javac而不是GNU风格(-lR 表示包含两个选项 l 和 R)。

  • 基于MIT协议发布。

option的几个field

  • *name指定该参数的名称
  • aliases指定该参数的别名,
  • usage解释该参数的作用
  • metaVar解释该参数的类型
  • required指定该参数是否为必须给定的

Demo

package daily;

import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;

import java.util.ArrayList;
import java.util.List;

import static org.kohsuke.args4j.OptionHandlerFilter.ALL;

/**
 * Created by pfliu on 2019/04/01.
 */
public class Args4JTest {

    @Option(name = "-bool", usage = "test a bool")
    private boolean testBool;

    @Option(name = "-string", usage = "test a string")
    private String testString;

    @Argument
    private List<String> arguments = new ArrayList<String>();

    public static void main(String[] args) {
        new Args4JTest().doMain(args);
    }

    private void doMain(String[] args) {
        CmdLineParser parser = new CmdLineParser(this);
        parser.setUsageWidth(80);

        try {
            parser.parseArgument(args);
            if (arguments.isEmpty())
                throw new CmdLineException(parser, "No argument is given");
        } catch (CmdLineException e) {
            System.err.println(e.getMessage());
            System.err.println("java SampleMain [options...] arguments...");
            parser.printUsage(System.err);
            System.err.println();
            System.err.println("  Example: java SampleMain" + parser.printExample(ALL));
            return;
        }
        System.out.println(testBool);
        System.out.println(testString);
    }
}

通过命令行启动该类,带上参数-bool=true -string=haha,可以看到预期之中的输出.

扩展

在使用spring的情况下这个其实是没有太多使用场景的,但是编程不止是spring.会有一些项目是手动管理的,或者日常我们写Demo的时候,希望动态的指定一些参数,可以使用这个jar包.算得上轻巧好用的小工具.

如果日常编写大量的Main类,其经常使用此功能,可以参考模板方法模式,实现一个AbstractMain类,在这个类中进行参数的加载(毕竟对类有侵入,parser.parseArgument(args);这一句是重点).然后其他类继承自父类且实现真正的main方法即可,还可以添加钩子方法来控制要不要加载参数.

一个使用的Demo

最近我有在写一个lucene的demo玩,本地和服务器上读取文件的目录不同,索引写入的目录也不同.出现过两次本地测试完毕之后打成jar包丢到服务器上因为目录不存在(或者不正确)二重新打jar的情况.

这时候可以使用args4j.每次启动的时候指定两个路径即可.避免了程序对路径的强依赖而出现上面那种尴尬的情况.





ChangeLog

2019-04-01 完成

以上皆为个人所思所得,如有错误欢迎评论区指正。

欢迎转载,烦请署名并保留原文链接。

联系邮箱:huyanshi2580@gmail.com

更多学习笔记见个人博客——>呼延十