【Debug】IntelliJ IDEA中Springboot项目有scope为provided包时启动报错找不到类FileNotFoundException
IntelliJ IDEA 默认不会将scope为provided的依赖添加到类路径中,因此启动时会报找不到类的错误,需要在启动设置中添加相应设置。
新拉取的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>
嗯?scope是proviced,应该和这个有关。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】确认。
添加后再启动项目不会报此错误。
更多推荐




所有评论(0)