命令行工具开发
命令行开发
Picocli 是专为 Java 设计的轻量级命令行开发框架,通过注解驱动简化命令行参数解析与工具开发流程。其核心价值在于将复杂的参数处理逻辑封装为简洁的代码,同时提供丰富的企业级功能支持。
官方文档:/
本文的目的是抛砖引玉,简要的描述一下命令行工具开发到底是如何实现的。
如何进行开发 - Demo演示
在项目的 pom.xml 文件中引入 Picocli 依赖
代码语言:xml复制<!-- -->
<dependency>
<groupId>info.picocli</groupId>
<artifactId>picocli</artifactId>
<version>4.7.5</version>
</dependency>
1.创建一个命令行工具类,实现 Runnable 接口 或 实现 Callable 接口;
在类名上添加注解 @Command
代码语言:java复制@Command(name="PicocliClass", version="Picocli 1.0", mixinStandardHelpOptions=true)
public class AsciiArt implements Runnable{
......
}
mixinStandardHelpOptions 参数设置为 true 时,程序会提供帮助手册;
2.在属性上添加 @Option 注解可实现通过选项赋值
代码语言:java复制@Option(names = { "-s", "--font-size"}, description="font size")
int fontSize = 19;
description 属性为含义,当我们在命令行输入 xxxx -s <数字>时,含义为将 fontSize 属性的值设置为 20 ;
3.在属性上添加 @Parameters 注解可实现通过输入赋值
代码语言:java复制@Parameters(paramLabel="<word>", defaultValue=“hello, picocli”, description="words to be translate into ascii art")
private String[] words = {“hello", "picocli"};
defaultValue 属性为默认值
required参数表示是否必输,在合适的时机使用
4.run 方法表示当任何命令被调起时,会调用该类的 run 方法运行(Callable 接口为 call 方法);
5.main 方法为类的具体实现方法
代码语言:java复制public static void main(String[] args){
// New CommandLine().execute(args) 为 Picocli 工具的默认写法,表示在命令行使用该类
int exitCode = New CommandLine(new AsciiArt).execute(args);
// 程序退出码,可以不写
System.exit(exitCode);
}
6.Demo 完整代码如下
代码语言:java复制@Command(name="PicocliClass", version="Picocli 1.0", mixinStandardHelpOptions=true)
public class AsciiArt implements Runnable{
@Option(names = { "-s", "--font-size"}, description="font size")
int fontSize = 19;
// @Option(names = "-option")
// int[] values;
@Parameters(paramLabel="<word>", defaultValue=“hello, picocli”, description="words to be translate into ascii art")
private String[] words = {“hello", "picocli"};
@Override
public void run(){
System.out.println("Demo start!");
}
public static void main(String[] args){
// New CommandLine().execute(args) 为 Picocli 工具的默认写法,表示在命令行使用该类
int exitCode = New CommandLine(new AsciiArt).execute(args);
// 程序退出码,可以不写
System.exit(exitCode);
}
}
运行 Demo,查看到我们所加入的内容。
交互式输入
交互式输入建议使用 Callable 接口
基本交互
代码语言:java复制// 泛型写什么取决于调用的方法返回什么
public class Password implements Callable<Integer>{
// interactive 属性为是否交互
@Option(names = {"-p", "--password"}, description="Passphrase", interactive=true)
String password;
public Integer call() throws exception{
System.out.println(password);
return 0;
}
public static void main(String[] args){
New CommandLine(new Password).execute(args);
}
}
从 idea 内控制台运行能看到密码内容,但用 jar 包运行则看不到内容。
多选项交互
根据实际情况,可分为两种不同的场景:
可选式交互:用户可以在整个命令行中输入选项,不需要给用户提示信息;
强制式交互:用户必须获得提示并且输入选项;
初始 Demo 全类如下
代码语言:java复制// 泛型写什么取决于调用的方法返回什么
public class Password implements Callable<Integer>{
// interactive 属性为是否交互
@Option(names = {"-p", "--password"}, description="Passphrase", interactive=true)
String password;
@Option(names = {"-cp", "--check--password"}, description="checkPass", interactive=true)
String checkPass;
public Integer call() throws exception{
System.out.println(password);
return 0;
}
public static void main(String[] args){
New CommandLine(new Password).execute(args);
}
}
可选式交互
代码语言:java复制@Option(names = {"-p", "--password"}, description="Passphrase",arity="0..1" interactive=true)
String password;
@Option(names = {"-cp", "--check--password"}, description="checkPass",arity="0..1" , interactive=true)
String checkPass;
......
public static void main(String[] args){
args = new String[]{"-p"}
New CommandLine(new Password).execute(args);
}
arity 属性代表可以输入几个参数,0..1 表示可以不输入也可以输入一个;
echo 属性代表输入时显示输入字符(在 jar 包模式下输入字符不显示)
强制式交互
代码语言:java复制public static void main(String[] args){
args = new String[]{"-p", "-cp"}
New CommandLine(new Password).execute(args);
}
命令默认填写,表示必须输入;
子命令
子命令适用于功能较多、较为复杂的命令行程序
声明式设置
通过 @Command 注解的 subcommands 属性
代码语言:java复制@Command(subcopmmands = {AsciiArt.class})
public class Demo implements Callable<Integer>{
......
}
该段代码的含义是将 AsciiArt 类设置好的命令复用在该类中;
编程式设置
在创建 CommandLine 对象时,将内容通过 .addSubcopmmand方法添加至对象内
代码语言:java复制CommandLine commandLine = new CommandLine(new Demo()).addSubcommand("AsciiArt", new AsciiArt());
命令模式
命令模式是一种行为类设计模式,核心是将每种请求或操作封装一个独立的对象,从而可以集中管理这些请求或操作。
命令模式通过将请求的发送者和接收者解耦,提供了更大的灵活性和可维护性。
eg. 我们通过遥控器操作电视
应用场景
系统需要统一处理多种复杂的操作,例如操作排队、记录操作历史等。
系统需要持续增加新的命令或处理复杂的组合命令,使用命令模式可以实现解耦
生成 jar 包
在 pom.xml 中引入 maven-assembly-plugin 插件(biuld内),并且指定mainClass 为项目的主 Main 方法即可。
发布评论