我通常将所有命令行选项存储到不同的类,例如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);
}
如何在MyApp中仍具有执行控制权的同时将所有@Option
规范推到另一个类CliArguments?
我确信我错过了一些直截了当的东西。