通过CLI在java中传递参数

时间:2017-03-22 13:30:31

标签: java

Java 中通过 CLI 传递参数时,我们通常会像

一样传递
java -cp jar classname "args[0]" "args[1]"

我想传递像这样的论点 --host hostname --user username --password password等等。

请帮助我实现这一目标。

先谢谢!!

4 个答案:

答案 0 :(得分:5)

您可以按如下方式使用 commons-cli 库:

import org.apache.commons.cli.*;

public class Main {


    public static void main(String[] args) throws Exception {

        Options options = new Options();

        Option host = new Option("h", "host", true, "host address");
        host .setRequired(true);
        options.addOption(host);

        Option user = new Option("u", "user", true, "user login");
        user.setRequired(true);
        options.addOption(user);

        Option password = new Option("p", "password", true, "user's password");
        password.setRequired(true);
        options.addOption(password);

        CommandLineParser parser = new DefaultParser();
        HelpFormatter formatter = new HelpFormatter();
        CommandLine cmd;

        try {
            cmd = parser.parse(options, args);
        } catch (ParseException e) {
            System.out.println(e.getMessage());
            formatter.printHelp("my-program", options);

            System.exit(1);
            return;
        }

        String inputHost = cmd.getOptionValue("host");
        String inputUser = cmd.getOptionValue("user");
        String inputPassword = cmd.getOptionValue("password");


    }

}

答案 1 :(得分:1)

  

在2019年,与Apache Commons CLI相比,有更好的库来构建CLI应用程序。

考虑使用picocli获得一个超紧凑的程序,该程序会自动提供彩色帮助,并可以选择自动执行命令行。

您的程序可能如下所示:

@Command(name = "myapp", description = "Does cool stuff.", mixinStandardHelpOptions = true)
class MyApp implements Callable<Integer> {
    @Option(names = {"-s", "--host"}, required = true, description = "host name")
    String hostname;

    @Option(names = {"-u", "--user"}, required = true, description = "user name")
    String username;

    @Option(names = {"-p", "--password"}, interactive = true, description = "pass phrase")
    char[] password;

    public Integer call() {
        // business logic here...
        System.out.printf("host=%s, user=%s%n", hostname, username);
        return 0; // exit code signalling normal termination
    }

    public static void main(String[] args) {
        // in 1 line, parse the args, handle errors,
        // handle requests for help/version info, call the business logic
        // and obtain an exit status code:

        int exitCode = new CommandLine(new MyApp()).execute(args);
        System.exit(exitCode);
    }
}

使用picocli的一些优点:

colored usage help for MyApp

  • 命令名称,选项和选项参数使用ANSI颜色和样式与其他文本形成对比。这不仅看起来不错,还减轻了用户的认知负担,使您的应用更加用户友好。
  • 通过实现CallableRunnable,您可以在main方法中以一行代码设置并执行程序。业务逻辑采用call(或run)方法。
  • mixinStandardHelpOptions = true意味着--help--version选项是自动添加的。这些可以按预期工作,而无需进一步编码。
  • 您可以免费获得一些不错的安全优势:该程序将提示用户输入密码,并且用户可以输入密码而无需回显到控制台。此外,密码是在char[]数组中捕获的,因此在工作完成后可以将其从内存中清除掉-这是良好的安全性惯例。

有关向此程序添加TAB自动补全的信息,请参见Autocomplete for Java Command Line Applications

免责声明:我维护picocli。

答案 2 :(得分:0)

使用longOpt

示例:

options.addOption(Option.builder().argName("date")
        .desc("The start date (YYYY-MM-DD) from where to retrieve information.").hasArg(true).longOpt("sd")
        .numberOfArgs(1).required(false).build());

答案 3 :(得分:0)

您可以像解析普通程序参数一样轻松地执行此操作。这是一个小例子:

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        System.out.println(Arrays.toString(args));
        String host = args[1];
        String user = args[3];
        String password = args[5];
        System.out.println("Host: " + host);
        System.out.println("User: " + user);
        System.out.println("Password: " + password);
    }
}

如果我使用以下命令运行此程序:

java Main --host hostname --user username --password password

这是输出:

[--host, hostname, --user, username, --password, password]
Host: hostname
User: username
Password: password

或者,您可以使用像Apache Commons CLI这样的库,其中包含许多实用程序来解析命令行参数和选项:

import org.apache.commons.cli.*;

public class Main {

    public static void main(String[] args) {
        Options options = new Options();
        Option host = Option.builder()
                .longOpt("host")
                .hasArg()
                .valueSeparator(' ')
                .build();
        Option user = Option.builder()
                .longOpt("user")
                .hasArg()
                .valueSeparator(' ')
                .build();
        Option password = Option.builder()
                .longOpt("password")
                .hasArg()
                .valueSeparator(' ')
                .build();
        options.addOption(host);
        options.addOption(user);
        options.addOption(password);

        CommandLineParser parser = new DefaultParser();
        try {
            CommandLine line = parser.parse(options, args);
            System.out.println("Host: " + line.getOptionValue("host"));
            System.out.println("User: " + line.getOptionValue("user"));
            System.out.println("Pass: " + line.getOptionValue("password"));

        } catch (ParseException e) {
            System.err.println("Parsing failed. Reason: " + e.getMessage());
        }

    }
}

但是,此路由要求您将Apache Commons CLI添加到类路径中并将其包含在您的程序中(或将其添加为依赖管理程序(如Maven或Gradle))。看起来似乎更多工作,但Apache Commons CLI非常强大和灵活,可以解析许多命令行选项,而不是那么痛苦。

以下是使用Apache Commons CLI的示例类的输出:

Host: hostname
User: username
Password: password