在Java中解析命令行参数的好方法是什么?
在Java中解析命令行参数的好方法是什么?
看看这些:
或自己编写:
例如,这是使用commons-cli
解析2个字符串参数的方式:
import org.apache.commons.cli.*;
public class Main {
public static void main(String[] args) throws Exception {
Options options = new Options();
Option input = new Option("i", "input", true, "input file path");
input.setRequired(true);
options.addOption(input);
Option output = new Option("o", "output", true, "output file");
output.setRequired(true);
options.addOption(output);
CommandLineParser parser = new DefaultParser();
HelpFormatter formatter = new HelpFormatter();
CommandLine cmd = null;//not a good practice, it serves it purpose
try {
cmd = parser.parse(options, args);
} catch (ParseException e) {
System.out.println(e.getMessage());
formatter.printHelp("utility-name", options);
System.exit(1);
}
String inputFilePath = cmd.getOptionValue("input");
String outputFilePath = cmd.getOptionValue("output");
System.out.println(inputFilePath);
System.out.println(outputFilePath);
}
}
命令行用法:
$> java -jar target/my-utility.jar -i asd
Missing required option: o
usage: utility-name
-i,--input <arg> input file path
-o,--output <arg> output file
看看更新更多的JCommander。
我创建了它。 我很高兴收到问题或功能请求。
我一直在尝试维护一份Java命令行解析器列表。
现在是2022年,是时候比Commons CLI更好了... :-)
您应该构建自己的Java命令行解析器,还是使用库?
许多类似小型实用程序的应用程序可能会自己开发命令行解析功能,以避免增加外部依赖。 Picocli 可能是一个有趣的选择。
Picocli是一个现代化的库和框架,可轻松构建功能强大、用户友好、启用GraalVM的命令行应用程序。它只有1个源文件,因此应用程序可以将其包含为源代码以避免添加依赖项。
它支持颜色、自动完成、子命令等功能。编写于Java中,可从Groovy、Kotlin、Scala等中使用。
特性:
<command> -xvfInputFile
以及 <command> -x -v -f InputFile
)"1..*"
, "3..5"
使用帮助消息可以通过注释轻松自定义(无需编程)。例如:
(源代码)
我忍不住再添加一个截图来展示使用帮助消息的可能性。使用帮助是您的应用程序面向用户的一面,所以要有创意,尽情享受!
免责声明:我创建了picocli。非常欢迎反馈或问题。
最近有人指向了我一个args4j,它是基于注解的。我非常喜欢它!
我知道这里的大多数人会找出无数理由来反对我的方式,但没关系。我喜欢保持简单,所以我只是用 "=" 将键与值分开,并将它们存储在 HashMap 中,就像这样:
Map<String, String> argsMap = new HashMap<>();
for (String arg: args) {
String[] parts = arg.split("=");
argsMap.put(parts[0], parts[1]);
}
你可以始终维护一个期望的参数列表,以帮助用户在忘记参数或使用错误参数时... 如果你想要太多功能,那么这个解决方案也不适合你。
这是作为Bazel项目的一部分开源的Google命令行解析库。个人认为它是最好的,比Apache CLI要简单得多。
https://github.com/pcj/google-options
maven_jar(
name = "com_github_pcj_google_options",
artifact = "com.github.pcj:google-options:jar:1.0.0",
sha1 = "85d54fe6771e5ff0d54827b0a3315c3e12fdd0c7",
)
dependencies {
compile 'com.github.pcj:google-options:1.0.0'
}
<dependency>
<groupId>com.github.pcj</groupId>
<artifactId>google-options</artifactId>
<version>1.0.0</version>
</dependency>
创建一个继承OptionsBase
的类,并定义您的@Option
。
package example;
import com.google.devtools.common.options.Option;
import com.google.devtools.common.options.OptionsBase;
import java.util.List;
/**
* Command-line options definition for example server.
*/
public class ServerOptions extends OptionsBase {
@Option(
name = "help",
abbrev = 'h',
help = "Prints usage info.",
defaultValue = "true"
)
public boolean help;
@Option(
name = "host",
abbrev = 'o',
help = "The server host.",
category = "startup",
defaultValue = ""
)
public String host;
@Option(
name = "port",
abbrev = 'p',
help = "The server port.",
category = "startup",
defaultValue = "8080"
)
public int port;
@Option(
name = "dir",
abbrev = 'd',
help = "Name of directory to serve static files.",
category = "startup",
allowMultiple = true,
defaultValue = ""
)
public List<String> dirs;
}
解析参数并使用它们。
package example;
import com.google.devtools.common.options.OptionsParser;
import java.util.Collections;
public class Server {
public static void main(String[] args) {
OptionsParser parser = OptionsParser.newOptionsParser(ServerOptions.class);
parser.parseAndExitUponError(args);
ServerOptions options = parser.getOptions(ServerOptions.class);
if (options.host.isEmpty() || options.port < 0 || options.dirs.isEmpty()) {
printUsage(parser);
return;
}
System.out.format("Starting server at %s:%d...\n", options.host, options.port);
for (String dirname : options.dirs) {
System.out.format("\\--> Serving static files at <%s>\n", dirname);
}
}
private static void printUsage(OptionsParser parser) {
System.out.println("Usage: java -jar server.jar OPTIONS");
System.out.println(parser.describeOptions(Collections.<String, String>emptyMap(),
OptionsParser.HelpVerbosity.LONG));
}
}
myexecutable -c file.json -d 42 --outdir ./out
的内容。而我并没有看到你如何定义短/长/描述选项...祝好! - oHo