@Configuration 不在@SpringBootApplication 子package路径下无法自动加载

一、场景如下:
1、使用@SpringBootApplication 主类,注意package

package com.example.quartz;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
 
import com.example.spring.quartz.config.QuartzConfig;
 
@SpringBootApplication
public class QuartzSampleApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(QuartzSampleApplication.class, args);
    }
 
}
2、使用@Configuration的配置类,注意比较package路径

package com.example.spring.quartz.config;
 
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
 
import com.example.spring.quartz.constant.QuartzConstant;
import com.example.spring.quartz.job.MyJob;
 
@Configuration
public class QuartzConfig {
 
    @Bean(name = "exampleJob")
    public JobDetailFactoryBean exampleJob() {
        JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
        jobDetailFactoryBean.setJobClass(MyJob.class);
        jobDetailFactoryBean.setName("myJob1");
        jobDetailFactoryBean.setGroup("group1");
        jobDetailFactoryBean.setDescription("this is my first job");
        jobDetailFactoryBean.setDurability(true);
        jobDetailFactoryBean.setApplicationContextJobDataKey(QuartzConstant.QUARTZ_SPRING_CONTEXT_KEY);
        JobDataMap dataMap = new JobDataMap();
        dataMap.put("say", "Hello World");
        jobDetailFactoryBean.setJobDataMap(dataMap);
        return jobDetailFactoryBean;
    }
    
    @Bean(value = "exampleJobTrigger")
    public CronTriggerFactoryBean exampleJobTrigger(@Qualifier(value = "exampleJob") JobDetail jobDetail) {
        CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
        triggerFactoryBean.setName("task1");
        triggerFactoryBean.setGroup("group1");
        triggerFactoryBean.setCronExpression("0 0/1 * * * ?");
        //triggerFactoryBean.setMisfireInstruction(misfireInstruction);
        triggerFactoryBean.setPriority(5);
        triggerFactoryBean.setDescription("this is my ...");
        triggerFactoryBean.setJobDetail(jobDetail);
        return triggerFactoryBean;
    }
}
基本情况就这样,启动时无法加载QuartzConfig 类中声明的@Bean

二、分析原因
找了一会发现是package路径的问题,如果将QuartzConfig类的package改为com.example.quartz或com.example.quartz地子package就能加载QuartzConfig类中声明的@Bean。@SpringBootApplication中包含@EnableAutoConfiguration,会自动加载

声明@SpringBootApplication的类的package及其子package下的@Configuration类,创建Bean。所以,如果带有@Configuration的配置类不在声明@SpringBootApplication的类的package及其子package下是不会自动加载。

 

三、解决办法
方法一:将带有@Configuration的配置类移动到声明@SpringBootApplication的类的package及其子package下

方法二:使用@Import或@ComponentScan

package com.example.quartz;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Import;
 
import com.example.spring.quartz.config.QuartzConfig;
 
@SpringBootApplication
@Import(value = { QuartzConfig.class })
public class QuartzSampleApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(QuartzSampleApplication.class, args);
    } 

### Spring Boot项目打包JAR文件报错未找到或无法加载主类的解决方案 当遇到“Unable to find main class”的错误时,这意味着构建工具(如Maven)未能识别项目的主类位置。对于Spring Boot应用来说,确保`pom.xml`的插件配置正确至关重要。 #### 修改POM文件以指定Main-Class属性 为了使Spring Boot应用程序能够被打包成独立的JAR并正常运行,在`<build>`标签内添加`spring-boot-maven-plugin`插件,并设置其下的`<mainClass>`参数来指明程序入口点的位置[^1]: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> <configuration> <mainClass>com.example.MyApplication</mainClass> </configuration> </plugin> </plugins> </build> ``` 这里假设`MyApplication.java`位于`com.example`包下,实际开发应替换为自己的路径。 #### 清理与重建工程 完成上述修改之后,应当清理本地仓库缓存以及重新编译整个项目,以便让新的配置生效。可以通过命令行执行如下操作: ```shell mvn clean install ``` 这条指令会先清除旧的目标文件夹(`clean`),接着下载依赖项并按照最新的设定进行组装(`install`)。 #### 检查源码结构 如果仍然存在找不到主类的情况,则可能是由于IDEA或其他集成环境内的模块映射出现了偏差。此时建议核查项目根目录是否存在`.idea/modules.xml`这样的文件,确认其定义的module path是否指向了正确的src/main/java目录。另外也要留意是否有多个同名class存在于不同地方造成冲突的可能性。 #### 排除测试影响 有时某些特定条件下触发单元测试也会干扰最终产物的质量。比如引用提到的一个案例显示,因为试图访问不存在于目标机器上的资源而导致测试失败进而阻止了成功打包过程[^5]。因此可以考虑暂时跳过这些可能导致问题的部分: ```shell mvn package -DskipTests=true ``` 这样可以在不影响其他部分的前提下快速定位是不是由测试引起的异常状况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值