黑马程序员技术交流社区

标题: 使用Java编写基于命令行的程序 [打印本页]

作者: lilongbin2016    时间: 2016-12-15 13:23
标题: 使用Java编写基于命令行的程序
命令行程序需要包含的内容

    命令行参数解析
    程序以及参数说明
    程序功能的实现(这个根据自己情况而定)

Java中如何处理命令行参数

最直接的处理命令行的方法:

public class Cli {
        public static void main (String [] args)
        {
                for(String arg : args ) {
                        System.out.println(arg);
                }
        }
}

运行:



m-lv:cli lvjian$ javac Cli.java
m-lv:cli lvjian$ java Cli
m-lv:cli lvjian$ java Cli -file filename
-file
filename


复杂一点的命令处理

下面这段代码摘自我的Java2ObjC Tools工具:
Ant中的运行脚本

<target name="rk2" depends="compile">
         <java fork="true" classname="tools.restkit.RKTools" classpathref="classpath">
             <classpath path="${classes.dir}"/>
             <arg value="-o"/>
             <arg value="/Users/lvjian/macspace/changji/changji/src/models"/>
             <arg value="-v"/>
             <arg value="2"/>
             <arg value="-excludes" />
             <arg value="TaskCounts,TaskCycle,TaskLog,TaskRouter,FormatGroup,Project,Device,DevicePort"/>
         </java>
     </target>

程序代码段

public static void main(String[] args) throws ClassNotFoundException {
                ClassPathXmlApplicationContext ctx =
                        new ClassPathXmlApplicationContext("/tools/spring/restkit.xml");
                RKTools tools = (RKTools)ctx.getBean("rktools");
               
                if(args[0].equals("-o")) {
                        String output = args[1];
                        log.info("output path:" + output);
                        tools.setTargetSrc(output);
                }
               
                if(args[2].equals("-v")) {
                        String version = args[3];
                        log.info("version:" + version);
                        tools.setVersion(version);
                }
               
                if(args[4].equals("-excludes")) {
                        String excludes = args[5];
                        if(excludes != null) {
                                String[] arr = excludes.split(",");
                                tools.setExcludes(arr);
                        }
                }
               
                tools.generate();
        }

如果每个参数都这么解析,那太痛苦了。况且这里用了大量代码只做了解析工作,并且还没有做提供命令行参数说明文档。一般使用 Apache Common Cli 包解决。


一个完成的例子
使用Apache Common Cli 改造之前的 Cli 代码

(代码可以在附件找到)

import org.apache.commons.cli.*;

public class Cli {

        static Options opts = new Options();
       
        static {
        // 配置两个参数
        // -h --help 帮助文档
        // -f --file file参数
                opts.addOption("h", "help", false, "The command help");
                opts.addOption("f", "file", false,
                                "Input your file name.");
        }
   
    /**
     * 提供程序的帮助文档
     */
    static void printHelp(Options opts) {
        HelpFormatter hf = new HelpFormatter();
        hf.printHelp("The Cli app. Show how to use Apache common cli.", opts);
        }

        public static void main (String [] args) throws ParseException {
        // 解析参数
                CommandLineParser parser = new PosixParser();
                CommandLine cl = parser.parse(opts, args);
        
        if(cl.hasOption("h")) {
            printHelp(opts);
            return;
                }

        String filename = cl.getOptionValue("file");
        System.out.println(filename);
        }
}

运行

m-lv:cli lvjian$ java -jar cli.jar -h
usage: The Cli app. Show how to use Apache common cli.
-f,--file <arg>   Input your file name.
-h,--help         The command help
m-lv:cli lvjian$ java -jar cli.jar -f fileparameter
fileparameter
m-lv:cli lvjian$ java -jar cli.jar -file fileparameter
fileparameter






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2