首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >picocli :解析没有锅炉板的参数

picocli :解析没有锅炉板的参数
EN

Stack Overflow用户
提问于 2020-05-22 00:09:27
回答 1查看 178关注 0票数 1

我通常将所有命令行选项存储到一个不同的类,例如,CliArguments。这避免了主类中的噪音。这就是我对picocli的看法

代码语言:javascript
复制
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成为可调用或可运行的。但是对于CommandLinenew MyApp()不是命令,new CliArguments()是命令。

如果我想做这样的事

代码语言:javascript
复制
   final int exitCode = new CommandLine(new MyApp()).execute(args);
   if (0 != exitCode) {
     logger.error("Failed to parse");
     System.exit(exitCode);
   }

如何将所有的CliArguments规范推送到不同的类,即MyApp中的执行控制。

我肯定我错过了一些直接的东西。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-22 00:56:51

实现这一目标的最简单方法是在CliArguments中使混和成为MyApp。然后,我们可以将业务逻辑放入MyApp中,并使其成为RunnableCallable,这样我们就可以使用new CommandLine(new MyApp()).execute(args)引导应用程序。

例如:

代码语言:javascript
复制
@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命令的一部分。

您现在可以运行:

代码语言:javascript
复制
java MyApp -x

这个会打印出来

代码语言:javascript
复制
-x=true
-y=false

由于mixin有@Command(mixinStandardHelpOptions = true),所以MyApp命令也有--help--version选项,这些选项可以像您预期的那样工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61945779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档