【发布时间】:2020-05-22 00:09:27
【问题描述】:
我通常将所有命令行选项存储到不同的类中,例如 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 类在技术上不应实现 Callable 或 Runnable。我可以使 MyApp 成为 Callable 或 Runnable。但是对于 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);
}
如何将所有 @Option 规范推送到不同的类 CliArguments,同时仍然在 MyApp 中拥有执行控制权?
我确定我错过了一些直接的东西。
【问题讨论】:
标签: picocli