我通常将所有命令行选项存储到一个不同的类,例如,CliArguments。这避免了主类中的噪音。这就是我对picocli的看法
public final class MyApp {
private static final CliArguments cliArgs = new CliArguments();
private MyApp() {}
public static void main (String[] args) {
if (parseArgs (args)) {
new MyApp().execute();
}
}
/* want to avoid this boiler plate */
private static boolean parseArgs(String[] args) {
CommandLine cmd = new CommandLine ( cliArgs );
try {
cmd.parseArgs( args );
if (cmd.isUsageHelpRequested()) {
cmd.usage( cmd.getOut() );
return false;
}
else if ( cmd.isVersionHelpRequested() ) {
cmd.printVersionHelp (cmd.getOut());
return false;
}
logger.info("{}", cliArgs);
return true;
}
catch ( ParameterException ex ) {
logger.error ("Failure to parse : {}", ex);
return false;
}
}
private void execute() {
// execution logic
}
}如何避免锅炉板法,pargeArgs(String[])?从技术上讲,CliArguments类不应该实现可调用或可运行。我可以使MyApp成为可调用或可运行的。但是对于CommandLine,new MyApp()不是命令,new CliArguments()是命令。
如果我想做这样的事
final int exitCode = new CommandLine(new MyApp()).execute(args);
if (0 != exitCode) {
logger.error("Failed to parse");
System.exit(exitCode);
}如何将所有的CliArguments规范推送到不同的类,即MyApp中的执行控制。
我肯定我错过了一些直接的东西。
发布于 2020-05-22 00:56:51
实现这一目标的最简单方法是在CliArguments中使混和成为MyApp。然后,我们可以将业务逻辑放入MyApp中,并使其成为Runnable或Callable,这样我们就可以使用new CommandLine(new MyApp()).execute(args)引导应用程序。
例如:
@Command(mixinStandardHelpOptions = true, version = "1.0.0")
public class CliArgs {
@Option(names = "-x") boolean x;
@Option(names = "-y") boolean y;
}
@Command(name = "myapp", description = "...")
public class MyApp implements Runnable {
// options defined in the mixin are added to this command
// also, @Command attributes from the mixin are applied to this command
@Mixin
CliArgs cliArgs;
public void run() {
System.out.printf("-x=%s%n", cliArgs.x);
System.out.printf("-y=%s%n", cliArgs.y);
}
public void main(String... args) {
System.exit(new CommandLine(new MyApp()).execute(args));
}
}在CliArgs mixin中定义的选项将成为MyApp mixee的一部分。而且,在@Command中定义的任何CliArgs属性都会成为MyApp命令的一部分。
您现在可以运行:
java MyApp -x这个会打印出来
-x=true
-y=false由于mixin有@Command(mixinStandardHelpOptions = true),所以MyApp命令也有--help和--version选项,这些选项可以像您预期的那样工作。
https://stackoverflow.com/questions/61945779
复制相似问题