1

我通常将所有命令行选项存储到不同的类,例如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类不应实现CallableRunnable。我可以使MyApp成为CallableRunnable。但是对于CommandLinenew 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

我确信我错过了一些直截了当的东西。

4

1 回答 1

1

实现这一点的最简单CliArguments方法MyApp. 然后我们可以将业务逻辑放入其中MyApp,并使其成为我们可以引导应用程序的一个Runnable或多个。Callablenew 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));
    }
}

mixin中定义的选项CliArgs成为MyAppmixee 的一部分。此外,@Command在 中定义的任何属性都将CliArgs成为MyApp命令的一部分。

您现在可以运行:

java MyApp -x

这将打印

-x=true
-y=false

由于 mixin 具有@Command(mixinStandardHelpOptions = true),因此该MyApp命令还具有--help--version可以按预期工作的选项。

于 2020-05-22T00:56:51.970 回答