在 Java 中通过 CLI 传递参数时,我们通常会像
一样传递java -cp jar classname "args[0]" "args[1]"
我想传递像这样的论点
--host hostname --user username --password password
等等。
请帮助我实现这一目标。
先谢谢!!
答案 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的一些优点:
Callable
或Runnable
,您可以在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