`
sunxboy
  • 浏览: 2869554 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Args4J 使用指南

阅读更多


Args4J 是一个用来出来命令行的工具.

在实际的项目中用到命令行的并不是很常见,但当真正使用到时,特别是在程序启动时配置一下参数的时候就很有用了,如果参数很多的话,一个一个解析命令行还是比较麻烦的.这时使用Args4J就相当好办了. 在本文中我们来看看Args4J的使用,当需要时能提供一个解决方案.

Args4J使用一个被称为Option类的类来保存输入的参数,让后根据该类来应用参数,每个参数可以对应一个类中的属性,该属性用Annotation注释,在Annotation中给出该参数 的选项, 还可以配置其他有用的信息.该Annotation就是 Option 注解: 该注解的doc如下:

 

Marks a field/setter that receives a command line switch value.

This annotation can be placed on a field of type T or the method of the form void methodName(T value). Its access modified can be anything, but if it's not public, your application needs to run in a security context that allows args4j to access the field/method (see AccessibleObject.setAccessible(boolean).

The behavior of the annotation differs depending on T --- the type of the field or the parameter of the method.

Boolean Switch
When T is boolean , it represents a boolean option that takes the form of "-OPT". When this option is set, the property will be set to true.

String Switch
When T is String, it represents an option that takes one operand. The value of the operand is set to the property.

Enum Switch
When T is derived from Enum, it represents an option that takes an operand, which must be one of the enum constant. The comparion between the operand and the enum constant name is done in a case insensitive fashion.

For example, the following definition will represent command line options like "-coin penny" or "-coin DIME" but things like "-coin" or "-coin abc" are errors.

 enum Coin { PENNY,NICKEL,DIME,QUARTER }

 class Option {
   @Option(name="-coin")
   public Coin coin;
 }
 
File Switch
When T is a File, it represents an option that takes a file/directory name as an operand.

该注解有5各域 其中name是必须的,其他四个是可选的.如下所示,关于该注解的详细Doc请查看 其docs.

 

Required Element Summary

=======================
 String
name
          Name of the option, such as "-foo" or "-bar".
 
Optional Element Summary
 Class<? extends OptionHandler>
handler
          Specify the OptionHandler that processes the command line arguments.


 String
metaVar
          When the option takes an operand, the usage screen will show something like this:
 boolean required
          Specify that the option is mandatory.


 String
usage
          Help string used to display the usage screen.

 

 

当命令行设定后 其使用方式和java 命令里面的参数使用方式一样 如:java -cp ./calssPath/.......

下面通过一个例子来解释:

 

 /*
  * Created on 2006-2-21
  * @author icerain
  */
 package test.args4j;
 
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.CmdLineException;
 import org.kohsuke.args4j.CmdLineParser;
 import org.kohsuke.args4j.ExampleMode;
 import org.kohsuke.args4j.Option;
 import org.kohsuke.args4j.spi.BooleanOptionHandler;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
 public class TestArgs4J {
   // 利用Option注解来定义一个boolean 命令行参数 其参数name为 -re ,required指定该参数是必须的
   @Option(name = "-re", usage = "recursively run something", required = true)
   private boolean recursive;
 
   //利用Option注解定义一个File 命令行参数, name为-o, 输入时候知道该file的路径就可以了
   //metaVar 用来设定显示 使用方式时候的输出,这个输出为-o OUTPUT : output to this file
   //如果不指定该属性 则使用默认的代替 为-o FILE : output to this file
   @Option(name = "-o", usage = "output to this file", metaVar = "OUTPUT")
   private File out = new File(".");
 
   //If 'usage' value is empty, the option will not be displayed
     // in the usage screen.
   //注意该处没有指定 usage 属性 或者指定usage 但是其值为空的 如usage = "",这样当使用
   //parser.printExample(ExampleMode.ALL) 请注意下面第92行的输出
   @Option(name = "-str", required = true)
   //@Option(name = "-str", usage = "测试", required = true)  // 该行 -str参数有用
   // no usage
   
   private String str = "(default value)";
 
   // 整数参数
   @Option(name = "-n", usage = "repeat <n> times\nusage can have new lines in it and also it can be verrry long")
   private int num = -1;

// using 'handler=...' allows you to specify a custom OptionHandler
// implementation class. This allows you to bind a standard Java type
// with a non-standard option syntax
//指定一个特定的handler 
   @Option(name = "-custom", handler=BooleanOptionHandler.class,usage="boolean value for checking the custom handler")
    private boolean data;

// receives other command line parameters than options
   @Argument
   private List<String> arguments = new ArrayList<String>();

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

   public void doMain(String[] args) throws IOException {
//Creates a new command line owner that parses arguments/options

             and set them into the given object.
             CmdLineParser parser = new CmdLineParser(this);
    
    try {
    // parse the arguments.
    parser.parseArgument(args);
    
    // you can parse additional arguments if you want.
    // parser.parseArgument("more","args");
    
    // after parsing arguments, you should check
    // if enough arguments are given.
    if (arguments.isEmpty())
    throw new CmdLineException("No argument is given");
    
    } catch (CmdLineException e) {
    // if there's a problem in the command line,
    // you'll get this exception. this will report
    // an error message.
    System.err.println(e.getMessage());  //打印出错消息
    System.err.println("java SampleMain [options...] arguments...");
    // print the list of available options
    parser.printUsage(System.err);  // 打印参数的用法
    System.err.println();
    
    System.err.println("测试!!!!!");
    // print option sample. This is useful some time
    System.err.println("  Example: java SampleMain"
    + parser.printExample(ExampleMode.ALL));        
    
    // 注意 在Option中如果没有指定 usage 属性,
    System.err.println("/n 2.........");                
    
    //则这两行程序不会输出该参数的使用的
    
    System.err.println(" 2 Example2: java SampleMain"  
    
    //注意 在Option中如果没有指定 usage 属性,
    + parser.printExample(ExampleMode.REQUIRED));   
    
    //则这两行程序不会输出该参数的使用的
    return;
    }
    
    // this will redirect the output to the specified output
    System.out.println(out);
    
    if (recursive)
    System.out.println("-r flag is set");
    
         if (data)
    System.out.println("-custom flag is set");
    
         System.out.println("-str was " + str);
     
         if (num >= 0)
           System.out.println("-n was " + num);
     
         // access non-option arguments
         System.out.println("other arguments are:");
         for (String s : arguments)
           System.out.println(s);
       }
 
 }

 

 

当不使用命令行时候 输入信息如下:

Option "-re" is required

java SampleMain [options...] arguments...

-custom : boolean value for checking the custom handler

-n N : repeat <n> times

usage can have new lines in it and also it can be verrrrrrr

rrrrrrrrrrry long

-o OUTPUT : output to this file

-re : recursively run something

测试!!!!!

Example: java SampleMain -custom -n N -o OUTPUT -re  

// 注意该处没有 -str的出现
/n 2.........

2 Example2: java SampleMain -re

 // 注意该处没有 -str的出现
当使用 -re 为命令行输入时,输出如下:// 后为作者加的注释 不是输出

Option "-str" is required 

 //也要指定-str该参数
java SampleMain [options...] arguments...

-custom : boolean value for checking the custom handler

-n N : repeat <n> times

usage can have new lines in it and also it can be verrrrrrr

rrrrrrrrrrry long

-o OUTPUT : output to this file

-re : recursively run something

测试!!!!!

Example: java SampleMain -custom -n N -o OUTPUT -re

/n 2.........

2 Example2: java SampleMain -re

当使用-re -str some 为命令行输入时,结果如下:这是由于的73 行的判断引起的

No argument is given

java SampleMain [options...] arguments...

-custom : boolean value for checking the custom handler

-n N : repeat <n> times

usage can have new lines in it and also it can be verrrrrrr

rrrrrrrrrrry long

-o OUTPUT : output to this file

-re : recursively run something

测试!!!!!

Example: java SampleMain -custom -n N -o OUTPUT -re

/n 2.........

2 Example2: java SampleMain -re

使用-custom -n 2 -re -str some otherstring 为命令行输入时的 结果如下:

.    // file

-r flag is set

-custom flag is set

-str was some

-n was 2

other arguments are:

otherstring

当使用-custom -n 2 -re -str some -o log.txt otherstring 时候的输出如下:

log.txt

-r flag is set

-custom flag is set

-str was some

-n was 2

other arguments are:

otherstring

当使用一个不存在的参数时候 会有Exception的 例如:-custom -ee 2 -re -str some -o log.txt otherstring

其中-ee参数不存在 结果如下:

"-ee" is not a valid option

java SampleMain [options...] arguments...

-custom : boolean value for checking the custom handler

-n N : repeat <n> times

......

由以上的实例可以看出 args4J 取得命令行的输入参数,然后根据保存参数的类中的属性类型比较
 
并转换为适当的值, 然后我们可以使用这些属性了,这样就免去了自己判断args 的麻烦了,

当默认的Handler不满足你的要求时 可以自己扩展Handler实现,关于这点请参考Args4J的测试用例.

 

 

分享到:
评论
1 楼 lvshuding 2011-08-06  
学习了,多谢

相关推荐

    args4j-helpers_2.10-1.0.0.zip

    4. **文档生成**:args4j-helpers可以自动生成关于命令行选项的文档,这对于提供给用户清晰的使用指南非常有帮助。 5. **错误处理**:当用户提供的命令行参数不符合预期时,args4j-helpers可以提供友好的错误提示,...

    exe4j使用图解教程

    《exe4j使用详解——Java应用打包为exe的步骤指南》 在Java开发环境中,有时候我们需要将应用程序打包成Windows下的可执行文件(exe),以便于非开发人员方便使用。这时,exe4j就成为了一个非常实用的工具。exe4j是...

    Docx4j操作PPT指南

    ### Docx4j操作PPT指南 #### 一、概述 在现代办公环境中,PowerPoint (PPT) 是一种常用且重要的演示工具。随着技术的发展,越来越多的企业希望通过自动化的方式生成PPT文档,以提高工作效率。在众多解决方案中,**...

    log4j文档及使用

    而"log4j的使用.pdf"则是一份详细的使用指南,涵盖了Log4j的配置、API使用、性能优化等方面,是学习和掌握log4j的重要参考资料。 最后,"apache-log4j-1.2.15.zip"是Log4j的源码包,对于想要深入了解其内部实现机制...

    exe4j安装程序和文档说明

    这些文档通常包括了软件的快速入门指南、用户手册、API参考等,可以帮助你更深入地理解和使用exe4j。 总结,exe4j是Java开发者在Windows平台上发布自包含应用程序的一个有力工具。通过合理使用exe4j,不仅可以简化...

    Log4j2介绍和使用

    提供的压缩包文件"Log4j2文档"很可能包含了Log4j2的官方用户指南、API参考和示例等内容。这个文档将详细介绍Log4j2的所有功能、配置选项以及如何在实际项目中有效利用它们。通过阅读这些文档,开发者可以更深入地...

    barcode4j 源碼

    `barcode4j` 可以作为独立的命令行工具使用,也可以通过Java API在应用程序中调用。对于Web应用程序,可以集成到Apache FOP ( Formatting Objects Processor) 中,生成带有条形码的PDF文档。 ### 7. 示例代码 ```...

    配置Log4j的详细最好的日志工具

    ### 配置Log4j的详细指南:最佳的日志管理工具 #### 一、引言 在软件开发过程中,良好的日志记录对于调试、维护和性能优化等方面具有至关重要的作用。Log4j作为Apache下的一个开源项目,因其高度灵活性、易配置性...

    dom4j-2.0.3.jar

    - `说明.txt`:通常,这个文件会包含关于dom4j库的使用指南、版本信息、许可协议或者其他重要的开发者注意事项。 **使用dom4j** 要使用dom4j-2.0.3.jar,开发者需要将其添加到Java项目的类路径中。在Maven或Gradle...

    Dom4j解析xml java代码附带chm英文API

    同时,我们还会提及Dom4j API的CHM英文版,它为开发者提供了详细的函数参考和使用指南。 首先,我们需要理解Dom4j的基本概念。Dom4j是一个灵活且高性能的Java库,它提供了XML、XPath和XSLT的处理能力。与Java内置的...

    exe4j,把jar包转成exe可执行文件

    "Readme-说明.htm"文件通常包含了关于exe4j的详细使用指南、注意事项和可能遇到的问题解决方案。在使用过程中,如果遇到任何疑问或困难,应该首先查阅这个文件,了解软件的具体操作步骤和常见问题解答。 总的来说,...

    log4j-manual(en)

    总之,《log4j手册》为开发者提供了全面的log4j框架使用指南,不仅涵盖了基本的安装和配置步骤,还包括了高级功能的详细介绍,对于希望利用log4j优化Java应用程序日志管理的开发者来说,是一部不可或缺的资源。

    java打包为exe工具exe4j

    使用exe4j,开发者可以自定义可执行文件的许多方面,包括图标、启动选项、内存设置、JVM参数等。此外,exe4j还提供了集成的Java Classpath构建器,帮助开发者管理复杂的依赖关系。它支持多模块项目,允许将多个jar...

    web3j-struct-args

    4. README文件:通常会提供项目介绍、安装指南、如何运行测试等信息。 5. 示例或示例合约:展示如何使用web3j库与智能合约进行交互。 6. 构建脚本:如`gradlew`,用于执行Gradle任务的脚本。 总的来说,"web3j-...

    中文转拼音库 pinyin4j

    要使用 pinyin4j,首先需要将其库文件(通常为jar包)引入到项目中。在压缩包中,`lib` 目录包含了 pinyin4j 的库文件。在Java项目中,可以将这个库添加到类路径,以便在代码中使用。 **3. API详解** - `...

    java源码:中文转拼音库 pinyin4j.zip

    本文将详细介绍pinyin4j库的核心概念和使用方法。 1. **pinyin4j概述** pinyin4j是一个开源项目,由Barry De Zwart开发,主要用于将汉字转换为对应的拼音。它支持全拼和简拼,并且可以处理多音字,提供多种输出...

    基于java的开发源码-条形码生成库 Barcode4J.zip

    为了使用Barcode4J,开发者首先需要将其库文件加入到项目的类路径中,然后通过创建`BarcodeGenerator`对象,设置必要的参数(如条形码类型、数据内容等),最后调用生成方法将条形码写入到指定的输出流中。...

    VIM 文本编辑器基本使用指南

    ### VIM 文本编辑器基本使用指南 #### 模式 VIM(Vi IMproved)是一种高度可配置且功能强大的文本编辑器,在 Linux 和其他 Unix 类操作系统中广泛使用。了解其工作模式对于高效使用至关重要。 - **普通模式**:这...

    Java command line option parsing library-开源

    使用args4j时,首先需要在类中定义选项,通过使用特殊的注解如@Option和@Argument。例如,你可以定义一个名为`port`的选项,其默认值为8080,使用如下代码: ```java @Option(name = "-p", aliases = "--port", ...

    java程序转exe_exe4j

    ### Java程序转换为EXE文件的方法详解:使用exe4j工具 #### 一、概述 在实际的应用场景中,为了方便非技术用户使用Java应用程序,通常需要将其转换为Windows平台下的可执行文件(.exe)。这不仅可以提升用户体验,...

Global site tag (gtag.js) - Google Analytics