我想用 picocli 按以下格式解析选项:
application -mode CLIENT -c aaaa -d bbbb
application -mode SERVER -e xxxx -f yyyy
Run Code Online (Sandbox Code Playgroud)
mode是一个enum有价值观的人{ CLIENT, SERVER }
mode == CLIENT,-c和-d选项是强制性的,并且-e,-f不得使用。mode == SERVER,-e和-f选项是强制性的,并且-c,-d不得使用。换句话说,我想根据一个关键选项来选择所需的选项。这在 picocli 中可能吗?
我必须将大型 Spring boot 应用程序转换为灵活的 CLI 工具,其中 Spring boot 应用程序发送的请求(除其他外)由命令行中的用户输入确定。我决定使用 picocli 来实现命令行功能,但是我不知道如何做一些简单的事情,例如如果用户传递给定的选项标志,将一些文本打印到 stdout,Spring boot 只是像平常一样运行。我应该如何写这个以便 picocli 可以与 Spring boot 一起运行(并最终控制所有 Spring boot 的东西)
由于子命令支持(和基于注释的声明),我从 Apache Commons CLI 切换到 Picocli。
考虑一个像 这样的命令行工具git,带有像 这样的子命令push。Git 有一个主开关--verbose或-v用于在所有子命令中启用详细模式。如何实现在任何子命令之前执行的主开关?
这是我的测试
@CommandLine.Command(name = "push",
description = "Update remote refs along with associated objects")
class PushCommand implements Callable<Void> {
@Override
public Void call() throws Exception {
System.out.println("#PushCommand.call");
return null;
}
}
@CommandLine.Command(description = "Version control", subcommands = {PushCommand.class})
public class GitApp implements Callable<Void> {
@CommandLine.Option(names = {"-h", "--help"}, usageHelp = true, description = "Display this help message.")
private boolean usageHelpRequested; …Run Code Online (Sandbox Code Playgroud) 我有一个带有子命令的命令。在我的应用程序中,我希望用户强制指定子命令。我该怎么做?
@Parameters(index = "0")
private Double min_c_re;
@Parameters(index = "1")
private Double min_c_im;
@Parameters(index = "2")
private Double max_c_re;
@Parameters(index = "3")
private Double max_c_im;
@Parameters(index = "4")
private Integer max_n;
@Parameters(index = "5")
private Integer width;
@Parameters(index = "6")
private Integer height;
@Parameters(index = "7")
private Integer divisions;
@Parameters(index = "8", arity = "1..*")
private List<URL> hosts;
@Override
public void run() {
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
List<SubDivider.SubDivision> subDividedImages = new SubDivider(divisions, divisions).divide(image);
ExecutorService threadPool = Executors.newCachedThreadPool();
double …Run Code Online (Sandbox Code Playgroud) 我们开发了一个Java Cli应用程序,它具有带有类似选项的子命令.这就像svn:
svn commit -m messsage --username ARG --password ARG
svn checkout -r HEAD --username ARG --password ARG
Run Code Online (Sandbox Code Playgroud)
我的意思是每个子命令都有特殊的参数,我们也有全局参数,并且我们有一些参数对于某些子命令是相关的,但并不适用于所有子命令.
哪个命令行参数解析器支持该要求?
谢谢.
如何支持所有(或部分)命令和子命令的共享选项?例如,如果最终用户--stacktrace在命令行参数中的任何位置提供,则打印的任何错误都将包括堆栈跟踪。
我们可以使用 Mixin 定义布尔--stacktrace选项,并在所有(子)命令中包含此 Mixin,或者使用继承并让所有命令子类化定义布尔选项的类--stacktrace,但无论哪种方式,都会为每个命令。哪个选项为 true 取决于用户在 args 中放置的位置--stacktrace,因此确定是否--stacktrace提供了意味着迭代所有父命令并查看是否有任何为 true。
如果有一种更方便的方法来检测用户是否指定了这样的共享选项,那就太好了。
我遇到一种情况,我需要三个强制参数(field1、field2和 )field3。然后我希望用户输入 a command name(强制,值可以是create、list等)。命令名称必须输入,并且必须是单数(只能是其中之一)可以输入它们)。
有些命令会有参数,有些则没有。我该如何处理?
我尝试了以下操作,但出现错误:
ArgGroup has no options or positional parameters, and no subgroups
Run Code Online (Sandbox Code Playgroud)
public class CliParserArgs {
@Option(names = {"--field1"}, required = true)
private String field1;
@Option(names = {"--field2"}, required = true)
String field2;
@Option(names={"--field3"}, required = true)
String field3;
@Option(names = {"-h", "--help"}, usageHelp = true) boolean help;
class Create {
private final String val;
public Create(final String val) {
this.val = val;
} …Run Code Online (Sandbox Code Playgroud) 如何构建一个Spring Boot 2.3多命令 CLI 应用程序,该应用程序可以使用单个命令、@script 并在picocli中交互运行?它的行为应该像这样:
manager -u <user> -p <pass> [list|create|delete] # run and exit
manager -u <user> -p <pass> @script # run and exit
manager -u <user> -p <pass> # run shell
Run Code Online (Sandbox Code Playgroud)
需要用户名-u和密码,三个命令( 、和)各有不同的选项和参数。-plistcreatedelete
我在 cli-app 配置文件中有一个使用 micronaut 框架开发的应用程序。我的应用程序使用Hibernate和GORM包,所以application.yml中有相关配置
在默认配置中,micronaut 从 src/main/resources 加载 application.yml。
如果我希望我的应用程序从如下参数中加载 application.yml:
java -Dmicronaut.config=/etc/fooApp/application.yml -jar fooApp.jar
Run Code Online (Sandbox Code Playgroud)
我应该怎么做 ?谢谢
在使用 cli 之前,我会有一个启动类,它调用我的 ApplicationPropertiesProvider 类(它读取我的属性文件),然后启动业务逻辑。所以有一个分离,ApplicationPropertiesProvider 只有一个工作。
现在使用 picocli,指南/文档指出我必须使用 CommandLine.run(objectToPopulate, args) 或 CommandLine.call(objectToPopulate, args)。因此,使用 cli 参数 (ApplicationPropertiesProvider) 填充的类必须实现 Runnable 或 Callable。现在我可以将 Starter 类的启动代码粘贴到 run() 或 call() 方法中,然后放弃 Starter 类。但我不喜欢那样,我想将一个只包含属性的类和我的 Starter 类分开。
我想到并在下面的示例中显示的一种肮脏的解决方法是将参数从 main 方法传递给我的 Starter 类的构造函数,使用 CommandLine.run() 填充 ApplicationPropertiesProvider 但只实现一个空的 run() 或 call( ) 方法,因此它将立即返回到我的 Starter 类,然后我在那里启动业务逻辑。那将是我要求的结果(分离),但这样看起来真的很愚蠢。
还有一个刚刚出现的问题:如果我有多个包含业务代码的类以及它们自己的属性(而不是单个属性提供类)的标准情况:是否可以使用一个 cli 调用填充多个不同的类,即调用“test.jar command --a --b”,其中参数“a”直接指向“X”类的实例,“b”指向“Y”类的实例?
public class Starter {
public static void main(String[] args) {
new Starter(args);
}
public Starter(String[] args) {
app = ApplicationPropertiesProvider.getInstance();
CommandLine.run(app, args);
//then kick off the business logic …Run Code Online (Sandbox Code Playgroud) 尝试运行 JUnit 测试错误时,测试将无法正确运行
package picocli;
import picocli.CommandLine.Option;
public class ComparatorRunnerConfig {
@Option(names = {"-rc", "--report-class"}, required = false,
description = "define report")
private String report;
public String getReport() {
return report;
}
}
Run Code Online (Sandbox Code Playgroud)
我的 JUnit 测试:
package picocli;
import static org.junit.Assert.*;
import org.junit.Test;
public class ConfigurationTest {
@Test
public void testBasicConfigOptions() {
String args = "-rc BlahBlah";
ComparatorRunnerConfig mfc = new ComparatorRunnerConfig();
new CommandLine(mfc).parse(args);
String myTestValue = mfc.getReport();
assertEquals(myTestValue, "BlahBlah");
}
}
Run Code Online (Sandbox Code Playgroud)
测试失败。
picocli ×13
java ×9
command-line ×2
command ×1
maven ×1
micronaut ×1
parsing ×1
shell ×1
spring ×1
spring-boot ×1
subcommand ×1