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

Spring Boot Jar运行与IntelliJ中运行行为不一致问题排查

解决Spring Boot Jar包部署后找不到Rest API Bean的问题

这个问题我之前也碰到过好几次——本地IntelliJ运行一切正常,打包成Jar部署就找不到TempoRestApi类型的Bean,核心原因通常和Spring组件扫描范围、Rest Client注解配置或者Maven打包逻辑有关,给你几个具体的排查和解决方向:

1. 检查Rest API接口的注解配置

首先确认你的TempoRestApi接口是否正确标记了Spring能识别的Rest Client注解:

  • 如果用的是Spring Cloud OpenFeign:必须在接口上添加@FeignClient注解,并且指定服务名称或URL,同时要保证这个接口所在的包在Spring的扫描范围内。示例代码:
    @FeignClient(name = "tempo-api", url = "${tempo.api.base-url}")
    public interface TempoRestApi {
        // 你的Jira/Tempo API方法定义
        @GetMapping("/rest/tempo/1.0/worklogs")
        List<Worklog> getWorklogs(@RequestParam("accountId") String accountId);
    }
    
  • 如果用的是Spring 6+的RestClient(Spring Boot 3.2+):需要给接口添加@RestClient注解,或者通过@Bean手动注册这个接口的代理实例。

2. 确认Spring组件扫描范围

Spring Boot默认只会扫描主启动类所在包及其子包下的组件。如果com.pegusapps.dashboard.integration.tempo包不在主启动类的包层级下,就会导致接口和服务类无法被扫描到。
解决办法:在主启动类上添加@ComponentScan注解,指定要扫描的根包:

@SpringBootApplication
@ComponentScan(basePackages = "com.pegusapps.dashboard") // 覆盖默认扫描范围,包含所有子包
public class DashboardApplication {
    public static void main(String[] args) {
        SpringApplication.run(DashboardApplication.class, args);
    }
}

3. 检查Maven打包是否包含了目标类

有时候打包过程中会漏掉某些类,你可以通过以下命令检查Jar包内是否存在TempoRestApi类:

jar tf pegasapps-dashboard-0.4.0-SNAPSHOT.jar | grep TempoRestApi

如果返回空结果,说明这个类没被打包进去,大概率是因为类所在的目录不在src/main/java下,或者Maven的build配置有排除规则。此时需要检查pom.xml的<build>节点,确保没有不必要的exclude配置,并且执行mvn clean package重新打包。

4. 排查Profiles的影响

你启动时指定了ext-api-dev,dev两个Profiles,需要确认这两个Profiles的配置是否限制了Bean的加载:

  • 检查TempoRestApi或其相关配置类是否有@Profile注解,确保当前激活的Profiles包含允许加载的Profile;
  • 检查对应Profiles的配置文件(比如application-dev.yml)中是否有spring.autoconfigure.exclude配置,排除了Rest Client相关的自动配置类。

5. 确认服务实现类的配置

最后检查你的服务实现类:

  • 确保实现类上添加了@Service或@Component注解,让Spring能扫描到这个Bean;
  • 构造函数注入的逻辑是否正确:Spring 4.3+支持无@Autowired的构造函数注入,但如果是旧版本,需要在构造函数上添加@Autowired注解。示例:
    @Service
    public class TempoServiceImpl implements TempoService {
        private final TempoRestApi tempoRestApi;
    
        // Spring 4.3+无需@Autowired,自动识别构造函数注入
        public TempoServiceImpl(TempoRestApi tempoRestApi) {
            this.tempoRestApi = tempoRestApi;
        }
    
        // 服务方法实现
    }
    

按照以上步骤逐一排查,应该能定位到问题所在。

内容的提问来源于stack exchange,提问作者Emmerson Deneir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:12:59