java解析命令行参数

java应用中,经常需要向main方法传递参数(String[] args),比如:

java -jar test.jar arg1 arg2 arg3
# 其中test.jar是jar包名,arg1、arg2、arg3是要传递的参数

但是有时候需要向main方法传递命令行参数(比如不同命令行参数实现不同的处理逻辑),比如:

java -jar test.jar -a 6 -s 6 -m 10 -d 8
# 其中test.jar是jar包名,-a是命令行参数(其后的6是参数值),以此类推

这时候就需要对传递的命令行参数进行解析,再针对不同的解析结果设置不同的处理逻辑。

示例:

java应用需要根据传递的命令行参数来实现四则运算(加减乘除,只针对整数):

  • 代码中会定义一个int num = 6;
  • 命令行参数-a 1:加号,打印num+1;
  • 命令行参数-s 1:减号,打印num-1;
  • 命令行参数-m 1:乘号,打印num*1;
  • 命令行参数-d 1:除号,打印num/1;

实现过程:

apache commons-cli依赖包是一个专门用于解析命令行参数的包,其中几个比较重要的类或者接口包括:

  • Option:对应一个命令行参数(包括参数名缩写、参数名全称、参数描述等);
  • Options:Option组成的集合,能够完成Option对象的添加、删除等操作;
  • CommandLine:对应一个命令行对象,能够获取其中包含的参数名、参数值等;
  • CommandLineParser:将Options对象解析成CommandLine对象;
  • HelpFormatter:CommandLineParser解析出现异常时,打印帮助信息;

程序执行顺序如下:

  1. 根据命令行参数定义Option对象;
  2. 将Option对象添加到Options中;
  3. CommandLineParser解析传递给main方法的args得到CommandLine对象;
  4. 根据CommandLine对象包含的命令行参数设定处理逻辑。

详细代码:

<!-- pom.xml中添加commons-cli依赖 -->
<dependency>
    <groupId>commons-cli</groupId>
    <artifactId>commons-cli</artifactId>
    <version>1.4</version>
</dependency>
package com.example.cmdoption;

import org.apache.commons.cli.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestMain {

    public static void main(String[] args){
        // 根据命令行参数定义Option对象,第1/2/3/4个参数分别是指命令行参数名缩写、参数名全称、是否有参数值、参数描述
        Option opt1 = new Option("a","add",true,"add operation");
        opt1.setRequired(false);
        Option opt2 = new Option("s","subtract",true,"subbstract operation");
        opt2.setRequired(false);    // 设置该参数是否是必须的
        Option opt3 = new Option("m","multiply",true,"multiply operation");
        opt3.setRequired(false);
        Option opt4 = new Option("d","divide",true,"divide operation");
        opt4.setRequired(false);

        Options options = new Options();
        options.addOption(opt1);
        options.addOption(opt2);
        options.addOption(opt3);
        options.addOption(opt4);

        CommandLine cli = null;
        CommandLineParser cliParser = new DefaultParser();
        HelpFormatter helpFormatter = new HelpFormatter();

        try {
            cli = cliParser.parse(options, args);
        } catch (ParseException e) {
            // 解析失败是用 HelpFormatter 打印 帮助信息
            helpFormatter.printHelp(">>>>>> test cli options", options);
            e.printStackTrace();
        }

        //根据不同参数执行不同逻辑
        int num = 6;
        if (cli.hasOption("a")){
            int a = Integer.parseInt(cli.getOptionValue("a","1"));  // 获取参数“a”对应的参数值,如果为空则返回1(默认值)
            System.out.println(String.format(">>>>>> add operation, %s+%s=%s", num, a, num+a));
        }
        if(cli.hasOption("s")){
            int a = Integer.parseInt(cli.getOptionValue("s","1"));
            System.out.println(String.format(">>>>>> subtract operation, %s-%s=%s", num, a, num-a));
        }
        if(cli.hasOption("m")){
            int a = Integer.parseInt(cli.getOptionValue("m","1"));
            System.out.println(String.format(">>>>>> multiply operation, %s*%s=%s", num, a, num*a));
        }
        if(cli.hasOption("d")){
            int a = Integer.parseInt(cli.getOptionValue("d","1"));
            System.out.println(String.format(">>>>>> divide operation, %s/%s=%s", num, a, num/a));
        }
    }
}

测试结果:

1. shell中运行jar并添加命令行参数:
java -jar demo-0.0.1-SNAPSHOT.jar -a 6 -s 6 -m 10 -d 8
结果:
10:52:08.684 [main] INFO com.example.cmdoption.TestMain - >>>>>> add operation, 6+6=12
10:52:08.692 [main] INFO com.example.cmdoption.TestMain - >>>>>> subtract operation, 6-6=0
10:52:08.692 [main] INFO com.example.cmdoption.TestMain - >>>>>> multiply operation, 6*10=60
10:52:08.692 [main] INFO com.example.cmdoption.TestMain - >>>>>> divide operation, 6/8=0

2. 命令行参数名可以用全称,比如:
java -jar demo-0.0.1-SNAPSHOT.jar -a 6 --subtract 6 -m 10 -d 8

3. 测试下解析命令行参数异常时,HelpFormatter打印帮助信息:
java -jar demo-0.0.1-SNAPSHOT.jar -a 6 -s -m 10 -d 8
结果:
usage: >>>>>> test cli options
 -a,--add <arg>        add operation
 -d,--divide <arg>     divide operation
 -m,--multiply <arg>   multiply operation
 -s,--subtract <arg>   subbstract operation
org.apache.commons.cli.MissingArgumentException: Missing argument for option: s
        at org.apache.commons.cli.DefaultParser.checkRequiredArgs(DefaultParser.java:211)
       ......


 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要查看Java应用程序的启动参数,可以通过以下两种方式之一: 1. 在命令中运Java程序时使用“-version”或“-X”选项。例如,使用以下命令查看Java版本和默认启动参数: ``` java -version ``` 或者 ``` java -X ``` 2. 在Java应用程序中使用System.getProperty()方法获取启动参数。例如,使用以下代码获取Java虚拟机的启动参数: ``` String vmArgs = System.getProperty("java.vm.arguments"); System.out.println("VM arguments: " + vmArgs); ``` Java启动参数解析可以参考以下几个方面: 1. 标准参数:这些参数是由Java虚拟机定义的,用于控制其为。例如,“-version”和“-help”等。 2. 非标准参数:这些参数是由Java虚拟机供应商定义的,通常用于调试和性能分析。例如,“-XX:MaxHeapSize”和“-XX:+PrintGC”等。 3. 应用程序参数:这些参数是应用程序特定的,并由应用程序的开发者定义。例如,“-Dmyapp.config=file.properties”等。 在解析Java启动参数时,需要注意以下几个方面: 1. 参数顺序:Java启动参数的顺序通常很重要。例如,“-Dmyapp.config=file.properties -jar myapp.jar”和“-jar myapp.jar -Dmyapp.config=file.properties”可能会产生不同的结果。 2. 参数类型:Java启动参数通常有不同的类型,例如字符串、整数、布尔值等。在解析参数时,需要将参数转换为正确的类型。 3. 参数值:Java启动参数的值通常需要进验证和处理。例如,“-Xmx512m”需要验证其值是否合法,并将其转换为字节数等。 总之,Java启动参数解析是一个复杂的过程,需要仔细考虑各种情况和可能的错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值