Apache Commons CLI命令行启动

今天又看了下Hangout的源码,一般来说一个开源项目有好几种启动方式——比如可以从命令行启动,也可以从web端启动。今天就看看如何设计命令行启动...

Apache Commons CLI

Apache Commons CLI是开源的命令行解析工具,它可以帮助开发者快速构建启动命令,并且帮助你组织命令的参数、以及输出列表等。

CLI分为三个过程:

  • 定义阶段:在Java代码中定义Optin参数,定义参数、是否需要输入值、简单的描述等
  • 解析阶段:应用程序传入参数后,CLI进行解析
  • 询问阶段:通过查询CommandLine询问进入到哪个程序分支中

举个栗子

定义阶段:

Options options = new Options();
Option opt = new Option("h", "help", false, "Print help");
opt.setRequired(false);
options.addOption(opt);

opt = new Option("c", "configFile", true, "Name server config properties file");
opt.setRequired(false);
options.addOption(opt);

opt = new Option("p", "printConfigItem", false, "Print all config item");
opt.setRequired(false);
options.addOption(opt);

其中Option的参数:

  • 第一个参数:参数的简单形式
  • 第二个参数:参数的复杂形式
  • 第三个参数:是否需要额外的输入
  • 第四个参数:对参数的描述信息

解析阶段

通过解析器解析参数

CommandLine commandLine = null;
CommandLineParser parser = new PosixParser();
try {
    commandLine = parser.parse(options, args);
}catch(Exception e){
    //TODO xxx
}

询问阶段

根据commandLine查询参数,提供服务

HelpFormatter hf = new HelpFormatter();
hf.setWidth(110);

if (commandLine.hasOption('h')) {
    // 打印使用帮助
    hf.printHelp("testApp", options, true);
}

全部代码样例

package hangout.study;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;

public class CLITest {
    public static void main(String[] args) {
        String[] arg = { "-h", "-c", "config.xml" };
        testOptions(arg);
    }
    public static void testOptions(String[] args) {
        Options options = new Options();
        Option opt = new Option("h", "help", false, "Print help");
        opt.setRequired(false);
        options.addOption(opt);

        opt = new Option("c", "configFile", true, "Name server config properties file");
        opt.setRequired(false);
        options.addOption(opt);

        opt = new Option("p", "printConfigItem", false, "Print all config item");
        opt.setRequired(false);
        options.addOption(opt);

        HelpFormatter hf = new HelpFormatter();
        hf.setWidth(110);
        CommandLine commandLine = null;
        CommandLineParser parser = new PosixParser();
        try {
            commandLine = parser.parse(options, args);
            if (commandLine.hasOption('h')) {
                // 打印使用帮助
                hf.printHelp("testApp", options, true);
            }

            // 打印opts的名称和值
            System.out.println("--------------------------------------");
            Option[] opts = commandLine.getOptions();
            if (opts != null) {
                for (Option opt1 : opts) {
                    String name = opt1.getLongOpt();
                    String value = commandLine.getOptionValue(name);
                    System.out.println(name + "=>" + value);
                }
            }
        }
        catch (ParseException e) {
            hf.printHelp("testApp", options, true);
        }
    }
}

运行结果

usage: testApp [-c <arg>] [-h] [-p]
 -c,--configFile <arg>   Name server config properties file
 -h,--help               Print help
 -p,--printConfigItem    Print all config item
--------------------------------------
help=>null
configFile=>config.xml

Hangout中的应用

源码片段

package hangout.study;

import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;

public class HangoutMainTest {
    /**
     * 解析Hangout参数
     *
     * @param args
     * @return
     * @throws ParseException
     */
    private static CommandLine parseArg(String[] args) throws ParseException {
        //定义阶段
        Options options = new Options();
        options.addOption("h", false, "usage help");
        options.addOption("help", false, "usage help");
        options.addOption("f", true, "configuration file");
        options.addOption("l", true, "log file");
        options.addOption("w", true, "filter worker number");
        options.addOption("v", false, "print info log");
        options.addOption("vv", false, "print debug log");
        options.addOption("vvvv", false, "print trace log");
        //解析阶段
        CommandLineParser paraer = new BasicParser();
        CommandLine cmdLine = paraer.parse(options, args);
        //询问阶段
        if (cmdLine.hasOption("help") || cmdLine.hasOption("h")) {
            /*usage(); //这里作者自定义了帮助信息,其实可以使用helpFormat直接输出的*/

            HelpFormatter hf = new HelpFormatter();
            hf.setWidth(110);
            hf.printHelp("testApp", options, true);

            System.exit(-1);
        }

        // TODO need process invalid arguments
        if (!cmdLine.hasOption("f")) {
            throw new IllegalArgumentException("Required -f argument to specify config file");
        }

        return cmdLine;
    }

    public static void main(String[] args) throws Exception {
        String[] arg = {"-h","xx.file"};//输入参数
        CommandLine cmdLine = parseArg(arg);//解析参数
        System.out.println(cmdLine.getOptionValue("f"));//拿到重要参数
        //TODO
    }
}

参考

Apache Commons CLI 下载地址
Apache Commons CLI 官方指南
IBM 开发者文档
CSDN Commons CLI 使用详解

本文转自博客园xingoo的博客,原文链接:Apache Commons CLI命令行启动,如需转载请自行联系原博主。

时间: 2024-10-25 18:40:26

Apache Commons CLI命令行启动的相关文章

使用 Apache Commons CLI 开发命令行工具示例

概念说明 Apache Commons CLI 简介         Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能.     Apache Commons CLI 支持多种输入参数格式,主要支持的格式有以下几种: POSIX(Portable Operating System Interface of Unix)中的参数形式,例如 tar -zxvf foo.tar.gz GNU 中的长参数形式,例如 du

怎样从Windows命令行启动MySQL

要想从命令行启动MySQLd服务器,你应当启动控制台窗口(或"DOS window")并输入命令: C:\> C:\Program Files\MySQL\MySQL Server 5.0\bin\mysqld 根据系统中MySQL安装位置的不同,前面的例子中使用的路径也不同. 在非NT版本的Windows中,在后台启动mysqld.也就是,服务器启动后,你应当可以看见后面的命令提示.如果你用该方法在Windows NT.2000.XP或2003中启动服务器,服务器则在前台运行,

如何从Windows命令行启动MySQL

  要想从命令行启动mysqld服务器,你应当启动控制台窗口(或"DOS window")并输入命令: C:> C:Program FilesMySQLMySQL Server 5.0binmysqld 根据系统中MySQL安装位置的不同,前面的例子中使用的路径也不同. 在非NT版本的Windows中,在后台启动mysqld.也就是,服务器启动后,你应当可以看见后面的命令提示.如果你用该方法在Windows NT.2000.XP或2003中启动服务器,服务器则在前台运行,在服务器

从Windows命令行启动MySQL

要想从命令行启动mysqld服务器,你应当启动控制台窗口(或"DOS window")并输入命令: C:> C:Program FilesMySQLMySQL Server 5.0binmysqld 根据系统中MySQL安装位置的不同,前面的例子中使用的路径也不同. 在非NT版本的Windows中,在后台启动mysqld.也就是,服务器启动后,你应当可以看见后面的命令提示.如果你用该方法在Windows NT.2000.XP或2003中启动服务器,服务器则在前台运行,在服务器退出

ubuntu-Ubuntu下eclipse 只能命令行启动 创建了启动图标但是点击提示没安装java环境

问题描述 Ubuntu下eclipse 只能命令行启动 创建了启动图标但是点击提示没安装java环境 创建了启动图标但是点击提示没安装java环境其实我是装好java环境的 解决方案 java路径是否在系统路径

加载ofbiz的实例,用命令行启动,报以下错误

问题描述 加载ofbiz的实例,用命令行启动,报以下错误 希望有大神能指点 解决方案 http://wenku.baidu.com/link?url=z0tIWeQCwIUs6QUXmCK43YEFxxLDNdeR20zpy2UtRF2ZY7AvEVb7gEQrblOT5JOj1MjcStlOb2X-miK2ozyCexuCD3Oug36MjvNYuIlRuXC

vs2012-如何用命令行启动两个exe?

问题描述 如何用命令行启动两个exe? 做的是socket通信,c++的,vs2012,现在服务器端和客户端都做出来了,且能成功运行,.现在需要通过命令行的方式来启动这两个exe,如输入1,启动服务器端,输入2,启动客户端.也就是将两个exe变成一个.我现在是使用CreateProcess来调用exe,但只能调用一个,该如何解决? 解决方案 根据main函数的参数判断启动哪个 解决方案二: 我java的直接开启两个命令行就好啊,在一个开启了的命令行里输入start 解决方案三: 在你的程序中用G

Android中使用am命令实现在命令行启动程序详解_Android

在Android中,除了从界面上启动程序之外,还可以从命令行启动程序,使用的是命令行工具am. 复制代码 代码如下: usage: am [subcommand] [options]     start an Activity: am start [-D]         -D: enable debugging     send a broadcast Intent: am broadcast     start an Instrumentation: am instrument [flags

Delphi命令行启动

如何让Delphi启动更快呢,可以通过点击Delphi快捷图标右键中,加上如下参数达到目的.命令行启动  (1)跳过Delphi启动界面(no splash)     Delphi32.exe -ns  (2)启动时不打开空项目(no project)     Delphi32.exe -np  (3)打开多个IDE     当Delhi正在运行时,双击Wndows Explorer中的Delphi项目文件,并不打开新的IDE,而只是关闭Delphi中的当前项目,在这个IDE中打开.如果想在不同