Spring Shell无法初始化:CLI应用启动后无命令提示符
Spring Shell应用初始化后直接退出无命令提示符问题解决
我正在用Spring Shell开发多命令CLI应用,依赖内部core项目和Spring Boot框架,编译打包都正常,但运行带依赖的jar包时,Spring初始化完成后直接退出,没有出现Shell命令提示符,程序直接结束。
pom.xml配置
<groupId>es.uca.dss.sigeca</groupId> <artifactId>cli</artifactId> <version>1.0</version> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>es.uca.dss.sigeca</groupId> <artifactId>core</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <version>3.0.6</version> </dependency> <dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>2.1.5</version> </dependency> </dependencies> <build> <plugins> <!-- clean lifecycle --> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>3.1.2</version> <configuration> <archive> <manifest> <mainClass>es.uca.dss.sigeca.Main</mainClass> </manifest> </archive> </configuration> </plugin> <!-- 打包插件配置 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.3.0</version> <configuration> <archive> <manifest> <mainClass>es.uca.dss.sigeca.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
Main.java代码
package es.uca.dss.sigeca; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Main { public static void main( String[] args ) { SpringApplication.run(Main.class, args); } }
命令类代码
package es.uca.dss.sigeca; import org.springframework.shell.standard.ShellMethod; import java.util.Date; import org.springframework.shell.standard.ShellComponent; @ShellComponent public class MyCommands { IServicesClient servicesClient = ServicesProvider.getClientServices(); IServicesVehicle servicesVehicle = ServicesProvider.getVehicleServices(); IServicesReserve servicesReserve = ServicesProvider.getReserveServices(); @ShellMethod("Consults if a car is avalaible between two determined dates.") public void consultDisponibility(String enrollment, Date start, Date end) { if(servicesReserve.isAvailable(servicesVehicle.getVehicle(enrollment), start, end)) { System.out.println("It is avalaible.\n"); } else System.out.println("It is not avalaible.\n"); } @ShellMethod("Register a new client.") public void clientRegister(String ID, String contact, String name) { servicesClient.registerClient(ID, contact, name); } @ShellMethod("Edit data from a client.") public void clientEdit(String ID, String contact, int incidences) { servicesClient.editClient(ID, contact, incidences); } }
运行输出
java -jar target/cli-1.0-jar-with-dependencies.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.6) 15:31:09.186 [main] INFO es.uca.dss.sigeca.Main -- Starting Main using Java 17.0.7 with PID 39497 (/home/alex/Documentos/DSS/dss2022-2023-SiGeCa/cli/target/cli-1.0-jar-with-dependencies.jar started by alex in /home/alex/Documentos/DSS/dss2022-2023-SiGeCa/cli) 15:31:09.190 [main] DEBUG es.uca.dss.sigeca.Main -- Running with Spring Boot, Spring 15:31:09.192 [main] INFO es.uca.dss.sigeca.Main -- No active profile set, falling back to 1 default profile: "default" 15:31:09.194 [main] DEBUG org.springframework.boot.SpringApplication -- Loading source class es.uca.dss.sigeca.Main 15:31:09.309 [main] DEBUG /* 大量DEBUG日志... */ 'org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration' 15:31:11.105 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory -- Creating shared instance of singleton bean 'spring.sql.init-org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties' 15:31:11.143 [main] INFO es.uca.dss.sigeca.Main -- Started Main in 2.279 seconds (process running for 2.6) 15:31:11.146 [SpringApplicationShutdownHook] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext -- Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2b4a2ec7, started on Tue Apr 25 15:31:09 CEST 2023
问题原因及解决办法
核心问题:版本不兼容
Spring Boot 3.0.6基于Spring 6,而你使用的Spring Shell 2.1.5是基于Spring 5的版本,两者依赖不兼容,导致Shell环境无法正确初始化,Spring容器启动后直接退出。
解决步骤:
升级Spring Shell版本
替换pom中Spring Shell依赖为适配Spring Boot 3的版本,比如3.1.1(匹配Spring Boot 3.0.x系列):<dependency> <groupId>org.springframework.shell</groupId> <artifactId>spring-shell-starter</artifactId> <version>3.1.1</version> </dependency>替换打包插件
Maven Assembly插件不适合打包Spring Boot应用,改用Spring Boot官方的spring-boot-maven-plugin,它会正确处理Spring Boot应用的类路径和启动逻辑:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.0.6</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>es.uca.dss.sigeca.Main</mainClass> </configuration> </plugin> </plugins> </build>重新打包运行
执行命令:mvn clean install -DskipTests java -jar target/cli-1.0.jar注意:Spring Boot插件打包后的jar包名称不带
-jar-with-dependencies后缀,直接使用artifactId-version.jar即可。
额外检查
- 确保命令类
MyCommands所在包在@SpringBootApplication的扫描范围内(你的代码中两者同包,无需额外配置)。 - 如果仍有问题,可添加Spring Shell日志配置排查错误:在
src/main/resources/application.properties中添加:logging.level.org.springframework.shell=DEBUG
内容的提问来源于stack exchange,提问作者AlexZape
相关产品推荐
相关产品推荐

