picocli为什么无法从命令行识别我的选项?

时间:2020-07-18 00:00:16

标签: java command-line-interface picocli

我正在尝试使用PICOCLI在Java中构建CLI,而我很坚持。我根本无法让我的应用程序向消费者提供选择权,这是有价值的。这是我的课:

package com.example.demo;

import org.springframework.boot.autoconfigure.SpringBootApplication;
import picocli.CommandLine;

@SpringBootApplication

@CommandLine.Command(name = "Greet", header = "%n@|green Hello world demo|@")
class DemoApplication implements Runnable {

    @CommandLine.Option(names = {"-u", "--user"}, required = true, description = "The user name.")
    String userName;

    public void run() {
        System.out.println("Hello, " + userName);
    }

    public static void main(String... args) {
        CommandLine.run(new DemoApplication(), System.err, args);
    }
}

然后我做一个mvn packagecd targetjava -jar demo-1.0.jar Greet -u pico,但是我只有这样:

Unmatched argument at index 0: 'Greet'

Hello world demo
Usage: Greet -u=<userName>
  -u, --user=<userName>   The user name.

我已经没有耐心尝试打印一条简单的消息了!我不知道该怎么解决。请帮忙!

1 个答案:

答案 0 :(得分:2)

如果使用java调用命令,则无需指定命令名称Greet,只需指定命令行选项:

java -jar demo-1.0.jar -u pico

您可以这样想:java -jar demo-1.0.jar Greet命令。

您可能要使用Application Assembler Maven Plugin创建启动器脚本,然后将该启动器脚本命名为Greet

这样,程序的用户可以使用以下命令在命令行上调用它:

Greet -u pico

AppAssembler的Maven配置应如下所示:

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>appassembler-maven-plugin</artifactId>
        <version>1.10</version>
        <configuration>
          <programs>
            <program>
              <mainClass>com.example.demo.DemoApplication</mainClass>
              <id>Greet</id>
            </program>
          </programs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

更新:我在how to run picocli-based applications的用户手册中添加了一个部分。


更新2:建议您升级到picocli的最新版本;版本4.0引入了新的execute API,它对退出代码和错误处理提供了更好的支持。

在您的示例中,看起来像这样:


public static void main(String... args) {
  int exitCode = new CommandLine(new DemoApplication()).execute(args);
  System.exit(exitCode);
}