You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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容器启动后直接退出。

解决步骤:

  1. 升级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>
    
  2. 替换打包插件
    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>
    
  3. 重新打包运行
    执行命令:

    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 04:57:04