为子命令实现--help功能的问题求助
子命令实现--help功能的问题求助
看起来你是用Picocli做的命令行工具对吧?现在遇到的问题挺典型的:给子命令status传-h想调帮助,结果先抛了“Unknown option: '-h'”的错误,才输出帮助信息,完全不是预期的流畅体验,对吧?
先把你的执行场景贴出来更清楚:
执行的命令:
java --jar application-0.0.1-SNAPSHOT.jar status -h得到的输出:
Unknown option: '-h' Usage: application status Checks if the application server status Exit codes: 0 Application server is running 10 Application server is not running
看了你贴的@Command注解代码,问题根源在Picocli的默认行为上:它只会给顶级命令自动注册-h/--help这个帮助选项,子命令不会自动继承这个配置。所以当你给子命令传-h时,框架会把它当成非法参数报错,然后因为参数解析失败,才自动输出用法帮助——这就是你看到先报错再出帮助的原因。
给你两个简单的解决办法,选哪个看你的项目结构:
方法一:给子命令显式配置帮助选项
直接在子命令的@Command注解里加上helpOptions属性,明确告诉Picocli-h/--help是合法的帮助触发选项,这样就不会报错,直接流畅展示帮助了。修改后的代码示例:@Command(name = "asStatus", description = "Checks if the application server status", exitCodeListHeading = "Exit codes:%n", exitCodeList = { CommonExitCodes.OK + ": Application server is running", AsCommandExitCodes.AS_NOT_RUNNING + ": Application server is not running" // 其他退出码配置 }, helpOptions = @HelpOption(names = {"-h", "--help"}, description = "显示此帮助信息并退出。") ) // 你的子命令类实现(比如implements Runnable) public class AsStatusCommand implements Runnable { // 子命令的业务逻辑代码 }方法二:让子命令继承父命令的配置
如果你的项目里有顶级父命令,而且父命令已经配置了帮助选项,那可以给子命令类加个@ParentCommand注解,让子命令继承父命令的所有选项(包括帮助选项),这样也能解决问题:@Command(name = "asStatus", description = "Checks if the application server status", exitCodeListHeading = "Exit codes:%n", exitCodeList = { CommonExitCodes.OK + ": Application server is running", AsCommandExitCodes.AS_NOT_RUNNING + ": Application server is not running" // 其他退出码配置 } ) public class AsStatusCommand implements Runnable { @ParentCommand private YourParentCommandClass parentCommand; // 替换成你实际的父命令类 // 子命令的业务逻辑代码 }
试一下这两种方法,应该就能实现你想要的:传-h直接展示子命令的帮助,不会再先抛错误啦。
备注:内容来源于stack exchange,提问作者Oliver
相关产品推荐
相关产品推荐

