admin管理员组

文章数量:1028574

命令行工具开发

命令行开发

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,查看到我们所加入的内容。

picoCli-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 方法即可。

命令行工具开发

命令行开发

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,查看到我们所加入的内容。

picoCli-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 方法即可。

本文标签: 命令行工具开发