Cyh的博客

Email:kissyan4916@163.com
posts - 26, comments - 19, trackbacks - 0, articles - 220

制作命令行程序

Posted on 2009-12-11 23:22 啥都写点 阅读(861) 评论(0)  编辑  收藏 所属分类: J2SE

Apache组织的cli项目专门用于解决命令行参数的解析问题。使用cli项目的类库的关键技术点如下:

   •  命令行的每个参数选项都是一个org.apache.commons.cli.Option对象,命令行的所有参数选项的Option对象都放入org.apache.commons.cli.Options中。
   •  类org.apache.commons.cli.CommandLineParser命令行解析器的基类,它的一个具体实现类是org.apache.commons.cli.BasicParser,通过它的parse方法 能将输入的参数根据命令行参数选项进行解析,得到一个org.apache.commons.cli.CommandLine对象。
   •  CommandLine对象把输入的命令行参数封装起来,提供相应的检测和访问参数的方法。 

   •  org.apache.commons.cli.HelpFormatter 类用于格式化输出命令行程序的帮助信息。

/**-------------------------------BaseConsoleClient-----------------------------------*/
package book.string.console;

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.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;

/**
 * 命令行程序的基类,是一个抽象类
 * 采用了Apache组织的命令行解析器的包
 
*/

public abstract class BaseConsoleClient {
    
/**帮助选项,参数为-h或者--help,功能描述为Displays help */
    
private static final Option HELP =
        OptionBuilder.withDescription(
"Displays help")
        .withLongOpt(
"help")
        .create(
"h");
    
/** debug选项,是否打印调试信息     */
    
public static final Option DEBUG = new Option("debug""Enables debug mode");

    
// 命令的参数选项
    private Options options = new Options();
    
// 命令的帮助信息
    private String usageMsg;
    
// 命令的头信息
    private String header;
    
//是否debug
    private boolean debugMode; 
    
/**
     * 默认构造函数
     
*/

    
protected BaseConsoleClient(){
        
//不打印debug信息
        debugMode = false;
        
//将帮助和调试选项添加到命令的参数选项中
        options.addOption(HELP);
        options.addOption(DEBUG);
        
//默认帮助信息是类名
        usageMsg = getClass().getName();
    }

    
    
/**
     * 增加一个命令的参数选项
     * 
@param option
     
*/

    
protected void addOption(Option option){
        
this.options.addOption(option);
    }

    
    
protected void setUsageMsg(String msg){
        
this.usageMsg = msg;
    }

    
    
protected void setHeader(String header){
        
this.header = header;
    }

    
    
/**
     * 显示帮助信息
     
*/

    
public void displayUsage(){
        HelpFormatter formatter 
= new HelpFormatter();
        String header 
= (this.header == null?
                
"Options:" : this.header;
        formatter.printHelp(usageMsg, header, options, 
nullfalse);
    }

    
    
/**
     * 解析命令行参数
     * 
@param args
     * 
@return
     * 
@throws Exception
     
*/

    
public CommandLine parse(String[] args) throws Exception{
        
//新建一个命令行解析器
        CommandLineParser parser = new BasicParser();
        
//用解析器解析命令行参数
        CommandLine line = parser.parse(options, args);
        
//如果命令行中有-h,则打印帮助信息,并退出
        if (line.hasOption("h")){
            displayUsage();
            System.exit(
0);
        }
      
        
if (line.hasOption("debug")){
            
this.debugMode = true;
        }

        
return line;        
    }

    
    
public boolean isDebugMode(){
        
return this.debugMode;    
    }

}


/**-------------------------------------SayHello.java----------------------------------------------*/

package book.string.console;

import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;

public class SayHello extends BaseConsoleClient {

    
private static final String SAYHELLO_COMMAND = "SayHello";
    
private static final String SAYHELLO_USAGE = SAYHELLO_COMMAND;

    
private static final Option NAME =
        OptionBuilder.withDescription(
"The name of the person. This argument is required.").hasArg()
        .withLongOpt(
"name")
        .create(
"n");    
      
    
public static void main(String[] args){
        
        String name 
= null;
        
        SayHello client 
= new SayHello();
        client.addOption(NAME);

        client.setUsageMsg(SAYHELLO_USAGE);
        client.setHeader(
"Options:");
        
        
try {
            CommandLine line 
= client.parse(args);
            
if (line.hasOption("n")){
                name 
= line.getOptionValue("n");
            }
 else {
                System.err.println(
"Error: missing -n arguments.");
                System.err.println(
"Try '" + SAYHELLO_COMMAND 
                        
+ " -h' for more information.");
                System.exit(
1);
            }

           
        }
 catch (Exception e){
            
if (client.isDebugMode()){
                e.printStackTrace();
            }
 else {
                System.err.println(
"Error: " + e.getMessage());
            }

            System.exit(
1);
        }

        System.out.println(
"Hello, " + name + "!");
    }

}







                                                                                                       --    学海无涯