在Java中解析命令行参数的好方法是什么?
我需要用Java编写一个简单的命令行应用程序.使用一个负责解析命令的库并处理标志和可选/强制参数之类的事情会很好.
UPDATE
内置TAB完成的东西会特别棒.
我正在寻找Scala的命令行解析器,支持子命令(类似于Python中的argparse).看起来Scala(Scopt,Argot等)有许多不同的命令行解析器,但它们似乎都不支持子命令解析.我只是错过了这些其他库支持子命令的事实,如果没有,是否存在任何此类库?
我知道这个问题已经被提出,但我正在寻找具有特定功能的Java cli解析器.我希望它能够定义命令行树,从而使用子命令(和多个级别深度).因此,在我到达选项之前,我可以有3-4级命令.这些子命令是互斥的.谢谢
我知道这个问题在这里和其他地方已被多次询问过,因为我正在寻找答案.但是,它仍然让我感到困惑,为什么命令行解析器库不提供这种常见的使用场景,其中我有一组子命令,每个子命令都有自己的必需和可选参数集.类似的构造可以在git/svn中找到,但在它们的情况下,如果我没有弄错的话,子命令命令是一个独立的程序.
总而言之,我正在寻找的是一种简单的方法:
top_command subcmd_A [ command A's options ....]
top_command subcmd_B [ command B's options ....]
...
Run Code Online (Sandbox Code Playgroud)
在java的世界中,两个经常提到的库是Apache Command CLI和JSAP.我没有看到他们中的任何一个都考虑到这一点 - 虽然你可能会调整和定制很多东西以适应......但是定义一个选项的基本流程,注册......然后在最后,解析它们都没有'为了考虑使用不同子命令的情况,验证和解析器需要以不同的方式运行.
也许这里的常识是,这是特定于应用程序的,应留给应用程序本身来处理.我能想到的一种方法是定义一个BaseCommand类,每个子命令扩展它并自己注册......作为一种分解它以便于管理的方法.如果任何成熟的框架可以做到这一点,我会在这里感谢任何指针.
我对当前解析器功能的理解可能是错的,但是我们非常感激任何洞察力.
我正在尝试将Picocli与 Spring Boot 2.2 结合使用,将命令行参数传递给 Spring Bean,但不确定如何构造它。例如,我有以下@Command命令从命令行指定连接用户名和密码,但是我想使用这些参数来定义 Bean:
@Component
@CommandLine.Command
public class ClearJdoCommand extends HelpAwarePicocliCommand {
@CommandLine.Option(names={"-u", "--username"}, description = "Username to connect to MQ")
String username;
@CommandLine.Option(names={"-p", "--password"}, description = "Password to connect to MQ")
String password;
@Autowired
JMSMessagePublisherBean jmsMessagePublisher;
@Override
public void run() {
super.run();
jmsMessagePublisher.publishMessage( "Test Message");
}
}
@Configuration
public class Config {
@Bean
public InitialContext getJndiContext() throws NamingException {
// Set up the namingContext for the JNDI lookup
final Properties env …Run Code Online (Sandbox Code Playgroud) 从记录器 ( ) 重定向输出 (out/err).execute()或将输出重定向到记录器 ( ) 的正确/最简单方法是什么?.parseArgs()org.slf4j.Logger
(生产过程通常由调度程序执行,并输出到特定于应用程序的日志文件。并且 stdout/err,如果不重定向,就会转储到调度程序/服务器日志中 - 这是不合适的。因此出现了这个问题。)
我有这样的事情:
Logger logger = LoggerFactory.getLogger(MyApp.class);
// ...
new CommandLine(new MyApp())
.setOut(new LoggerWriter(logger, Level.INFO)
.setErr(new LoggerWriter(logger, Level.ERROR)
.execute(args);
// ...
Run Code Online (Sandbox Code Playgroud)
课堂LoggerWriter的灵感就来自这里。
我正在尝试使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我做了一个mvn package,cd target但java -jar demo-1.0.jar Greet -u pico我只遇到了这个:
Unmatched argument at index …Run Code Online (Sandbox Code Playgroud) 我必须将大型 Spring boot 应用程序转换为灵活的 CLI 工具,其中 Spring boot 应用程序发送的请求(除其他外)由命令行中的用户输入确定。我决定使用 picocli 来实现命令行功能,但是我不知道如何做一些简单的事情,例如如果用户传递给定的选项标志,将一些文本打印到 stdout,Spring boot 只是像平常一样运行。我应该如何写这个以便 picocli 可以与 Spring boot 一起运行(并最终控制所有 Spring boot 的东西)
picocli ×10
java ×7
command-line ×3
spring-boot ×2
interactive ×1
maven ×1
parsing ×1
scala ×1
shell ×1
spring ×1
subcommand ×1