新拉取的Springboot项目在IntelliJ IDEA中启动报错(下面的错误信息隐藏了真实包名):

17:04:07.741 [main] ERROR o.s.b.SpringApplication - [reportFailure,823] - Application run failed
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to parse configuration class [com.XXX.BootstrapApplication]; nested exception is java.io.FileNotFoundException: class path resource [com/XXX/model/service/impl/DefaultModelDataServiceImpl.class] cannot be opened because it does not exist
	at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:182)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:315)
	at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:232)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:275)
	at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:95)
	at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:706)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
	at com.XXX.BootstrapApplication.main(BootstrapApplication.java:13)
Caused by: java.io.FileNotFoundException: class path resource [com/XXX/model/service/impl/DefaultModelDataServiceImpl.class] cannot be opened because it does not exist
	at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180)
	...(省略)

搜索DefaultModelDataServiceImpl这个类,发现是存在的:
在这里插入图片描述
这就奇怪了,包已经在类路径(classpath)下了,竟然找不到。于是检查 IDEA 启动时类路径是否包含该包,发现不存在,再去pom.xml中查找该依赖的坐标。发现该依赖引用自一个自定义的spring-boot starter,定义如下:

<dependency>
	<groupId>com.XXX</groupId>
	<artifactId>XXX-model</artifactId>
	<version>${XXX-model.version}</version>
	<scope>provided</scope>
</dependency>

嗯?scopeproviced,应该和这个有关。
provide表明该依赖只在maven编译(mvn compile)和测试(mvn test)时会用到,这个报错就是启动编译时报的错,在mvn package时则不会报错。理论上来说,如果移除<scope>provided</scope>后应该就可以了,但是该 dependency 属于放在 starter 中的第三方依赖,不能修改。
拿着错误找百度,发现前人早已踩过此坑,比如 我参考的这篇博文,原来是IntelliJ IDEA的原因,它默认不会将<scope>provided</scope>的依赖包含在classpath中,需要单独设置运行或调试的启动设置。我用的是IntelliJ IDEA Community Edition 2021.2.1,设置方式如下:
在这里插入图片描述
在【Run/Debug Configurations】设置中点击右侧【Modify options】,勾选Add dependencies with "provided" scope to classpath选项,然后在设置界面即可看到添加项结果,最后别忘了点击【OK】或【Apply】确认。
在这里插入图片描述
添加后再启动项目不会报此错误。

Logo

一站式 AI 云服务平台

更多推荐