公司有一个紧急需求,通过websocket调用服务端接口,由于时间有限决定给客户先做一个命令行的脚本demo,学习了一下spring shell,写个博客记录一下。
需要引入spring boot
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.0.RELEASE</version> </parent>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>2.0.0.RELEASE</version> </dependency>
我还配置了maven的打包工具
<build> <plugins> <plugin> <!-- 配置打包工具 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.5.RELEASE</version> <configuration> <!-- 工程主入口 --> <mainClass>com.bjnet.test.Main</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
springboot项目 和 springboot一样
@SpringBootApplication public class Main { public static void main(String[] args) { SpringApplication app = new SpringApplication(Main.class); app.setBannerMode(Banner.Mode.OFF); app.setWebApplicationType(WebApplicationType.NONE); app.run(args); } }
@ShellComponent public class CalculatorCommands { @ShellMethod("计算两个整数的加法") public int add(int a, int b){ return a + b; } }
打包后 java -jar xxx.jar 运行 add a b
将add命令自定义为-a
@ShellComponent public class CalculatorCommands { @ShellMethod(value = "计算两个整数的加法",key = {"-a"}) public int add(int a, int b){ return a + b; } }
命令就变为-a a b,add命令就会失效
当输入的命令需要参数时,可以在参数列表指定一个默认值,用户没有输入参数时会使用默认值
@ShellComponent public class CalculatorCommands { @ShellMethod(value = "计算两个整数的加法",key = {"-a"}) public int add(@ShellOption(defaultValue = "0")int a){ return a + b; } }
-a命令的a的默认值就是0
这里要注意defaultvalue=“0” 双引号不可少
int spring都要加双引号
@Bean public PromptProvider promptProvider() { return () -> new AttributedString("aaa=>", AttributedStyle.DEFAULT.foreground(AttributedStyle.BLUE)); }
命令前的shell就变为了蓝色的 aaa=>
AttributedStyle中还有许多定义文字粗体 隐藏 颜色的,可根据需要自定义
@ShellMethod(value = "关闭WebSocket连接",key = {"-c"}) public void close(){ app.stop(); } public Availability closeAvailability(){ return isConnect ? Availability.available(): Availability.unavailable("you are not connect"); }
当用户输入-c命令时 会先执行return中的逻辑 判断是否是连接的 只有连接后才能输入-c关闭命令 否则报错,报错提示写在unavailable中。
这里的closeavailability 对应上面的方法名close 要对应 否则不生效
当然需要多次使用一个验证的时候,也可以指定availability的名字
@ShellMethod(value = "",key = {"-s"}) @ShellMethodAvailability({"isLogin"}) public void start(){ System.out.println("start"); } } @ShellMethod(value = "",key = {"-c"}) @ShellMethodAvailability({"isLogin"}) public void close(){ System.out.println("close"); } } public Availability isLogin(){ return isLogin ? Availability .available():Availability .unavailable("you are not login"); }
只有登录后才能运行开始和关闭命令
@ShellMethodAvailability指定方法名 实现复用
引用:https://blog.csdn.net/zongf0504?spm=1001.2014.3001.5509