该问题出现原因多样,大多数是因为配置不当的问题,首先要确定自己问题是不是与本问题出现原因一样。
背景
项目在idea突然就报错了
error starting applicationcontext. to display the conditions report re-run your application with 'debug' enabled.
2019-06-18 16:52:29.850 error 9248 --- [ main] o.s.boot.springapplication : application run failedorg.springframework.context.applicationcontextexception: unable to start web server; nested exception is org.springframework.context.applicationcontextexception: unable to start servletwebserverapplicationcontext due to missing servletwebserverfactory bean.
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.onrefresh(servletwebserverapplicationcontext.java:157) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:543) ~[spring-context-5.1.7.release.jar:5.1.7.release]
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.refresh(servletwebserverapplicationcontext.java:142) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.refresh(springapplication.java:775) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.refreshcontext(springapplication.java:397) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.run(springapplication.java:316) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.run(springapplication.java:1260) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.run(springapplication.java:1248) [spring-boot-2.1.5.release.jar:2.1.5.release]
at com.ynkg.pongal.pongalapplication.main(pongalapplication.java:22) [classes/:na]
caused by: org.springframework.context.applicationcontextexception: unable to start servletwebserverapplicationcontext due to missing servletwebserverfactory bean.
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.getwebserverfactory(servletwebserverapplicationcontext.java:206) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.createwebserver(servletwebserverapplicationcontext.java:180) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.onrefresh(servletwebserverapplicationcontext.java:154) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
... 8 common frames omitted
一大串错误的核心信息是
org.springframework.context.applicationcontextexception: unable to start servletwebserverapplicationcontext due to missing servletwebserverfactory bean.
网上查找内容大多说的是不是配置没配好之类的,然而都没法解决我的情况,所以只好自己研究了。
过程
一阵断定定位,最终到了
//servletwebserverapplicationcontext
protected servletwebserverfactory getwebserverfactory() {
// use bean names so that we don't consider the hierarchy
string[] beannames = getbeanfactory()
.getbeannamesfortype(servletwebserverfactory.class);
if (beannames.length == 0) {
throw new applicationcontextexception(
"unable to start servletwebserverapplicationcontext due to missing "
+ "servletwebserverfactory bean.");
}
if (beannames.length > 1) {
throw new applicationcontextexception(
"unable to start servletwebserverapplicationcontext due to multiple "
+ "servletwebserverfactory beans : "
+ stringutils.arraytocommadelimitedstring(beannames));
}
return getbeanfactory().getbean(beannames[0], servletwebserverfactory.class);
}
貌似没啥特殊的,
大概就是说加载不到servletwebserverfactory,idea定位下,可以发现,这个工厂接口有3个实现类
jettyservletwebserverfactorytomcatservletwebserverfactoryundertowservletwebserverfactory
回到问题,无法实例化bean出现的错误,那么是不是可以考虑手动标记呢?
处理
给启动类添加上bean声明,也就是当启动时,web服务容器会加载这么一个bean
@bean
servletwebserverfactory servletwebserverfactory(){
return new tomcatservletwebserverfactory();
}
运行项目,发现依然报错了,万幸的是,这次错误信息有变化了,很长一段。
error starting applicationcontext. to display the conditions report re-run your application with 'debug' enabled.
2019-06-18 17:10:46.352 error 11224 --- [ main] o.s.boot.springapplication : application run failedorg.springframework.context.applicationcontextexception: unable to start web server; nested exception is org.springframework.beans.factory.beancreationexception: error creating bean with name 'servletwebserverfactory' defined in com.ynkg.pongal.pongalapplication: bean instantiation via factory method failed; nested exception is org.springframework.beans.beaninstantiationexception: failed to instantiate [org.springframework.boot.web.servlet.server.servletwebserverfactory]: factory method 'servletwebserverfactory' threw exception; nested exception is java.lang.noclassdeffounderror: org/apache/catalina/core/aprlifecyclelistener
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.onrefresh(servletwebserverapplicationcontext.java:157) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.context.support.abstractapplicationcontext.refresh(abstractapplicationcontext.java:543) ~[spring-context-5.1.7.release.jar:5.1.7.release]
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.refresh(servletwebserverapplicationcontext.java:142) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.refresh(springapplication.java:775) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.refreshcontext(springapplication.java:397) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.run(springapplication.java:316) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.run(springapplication.java:1260) [spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.springapplication.run(springapplication.java:1248) [spring-boot-2.1.5.release.jar:2.1.5.release]
at com.ynkg.pongal.pongalapplication.main(pongalapplication.java:22) [classes/:na]
caused by: org.springframework.beans.factory.beancreationexception: error creating bean with name 'servletwebserverfactory' defined in com.ynkg.pongal.pongalapplication: bean instantiation via factory method failed; nested exception is org.springframework.beans.beaninstantiationexception: failed to instantiate [org.springframework.boot.web.servlet.server.servletwebserverfactory]: factory method 'servletwebserverfactory' threw exception; nested exception is java.lang.noclassdeffounderror: org/apache/catalina/core/aprlifecyclelistener
at org.springframework.beans.factory.support.constructorresolver.instantiate(constructorresolver.java:627) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.constructorresolver.instantiateusingfactorymethod(constructorresolver.java:456) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.instantiateusingfactorymethod(abstractautowirecapablebeanfactory.java:1321) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbeaninstance(abstractautowirecapablebeanfactory.java:1160) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.docreatebean(abstractautowirecapablebeanfactory.java:555) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.abstractautowirecapablebeanfactory.createbean(abstractautowirecapablebeanfactory.java:515) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.abstractbeanfactory.lambda$dogetbean$0(abstractbeanfactory.java:320) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.defaultsingletonbeanregistry.getsingleton(defaultsingletonbeanregistry.java:222) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.abstractbeanfactory.dogetbean(abstractbeanfactory.java:318) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.abstractbeanfactory.getbean(abstractbeanfactory.java:204) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.getwebserverfactory(servletwebserverapplicationcontext.java:216) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.createwebserver(servletwebserverapplicationcontext.java:180) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.web.servlet.context.servletwebserverapplicationcontext.onrefresh(servletwebserverapplicationcontext.java:154) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
... 8 common frames omitted
caused by: org.springframework.beans.beaninstantiationexception: failed to instantiate [org.springframework.boot.web.servlet.server.servletwebserverfactory]: factory method 'servletwebserverfactory' threw exception; nested exception is java.lang.noclassdeffounderror: org/apache/catalina/core/aprlifecyclelistener
at org.springframework.beans.factory.support.simpleinstantiationstrategy.instantiate(simpleinstantiationstrategy.java:185) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
at org.springframework.beans.factory.support.constructorresolver.instantiate(constructorresolver.java:622) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
... 20 common frames omitted
caused by: java.lang.noclassdeffounderror: org/apache/catalina/core/aprlifecyclelistener
at org.springframework.boot.web.embedded.tomcat.tomcatservletwebserverfactory.getdefaultlifecyclelisteners(tomcatservletwebserverfactory.java:158) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at org.springframework.boot.web.embedded.tomcat.tomcatservletwebserverfactory.<init>(tomcatservletwebserverfactory.java:114) ~[spring-boot-2.1.5.release.jar:2.1.5.release]
at com.ynkg.pongal.pongalapplication.servletwebserverfactory(pongalapplication.java:33) [classes/:na]
at com.ynkg.pongal.pongalapplication$$enhancerbyspringcglib$$951efaf5.cglib$servletwebserverfactory$1(<generated>) ~[classes/:na]
at com.ynkg.pongal.pongalapplication$$enhancerbyspringcglib$$951efaf5$$fastclassbyspringcglib$$d7e2ff01.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.methodproxy.invokesuper(methodproxy.java:244) ~[spring-core-5.1.7.release.jar:5.1.7.release]
at org.springframework.context.annotation.configurationclassenhancer$beanmethodinterceptor.intercept(configurationclassenhancer.java:363) ~[spring-context-5.1.7.release.jar:5.1.7.release]
at com.ynkg.pongal.pongalapplication$$enhancerbyspringcglib$$951efaf5.servletwebserverfactory(<generated>) ~[classes/:na]
at sun.reflect.nativemethodaccessorimpl.invoke0(native method) ~[na:1.8.0_191]
at sun.reflect.nativemethodaccessorimpl.invoke(nativemethodaccessorimpl.java:62) ~[na:1.8.0_191]
at sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:43) ~[na:1.8.0_191]
at java.lang.reflect.method.invoke(method.java:498) ~[na:1.8.0_191]
at org.springframework.beans.factory.support.simpleinstantiationstrategy.instantiate(simpleinstantiationstrategy.java:154) ~[spring-beans-5.1.7.release.jar:5.1.7.release]
... 21 common frames omitted
caused by: java.lang.classnotfoundexception: org.apache.catalina.core.aprlifecyclelistener
at java.net.urlclassloader.findclass(urlclassloader.java:382) ~[na:1.8.0_191]
at java.lang.classloader.loadclass(classloader.java:424) ~[na:1.8.0_191]
at sun.misc.launcher$appclassloader.loadclass(launcher.java:349) ~[na:1.8.0_191]
at java.lang.classloader.loadclass(classloader.java:357) ~[na:1.8.0_191]
... 34 common frames omitted
核心错误信息是
caused by: java.lang.classnotfoundexception: org.apache.catalina.core.aprlifecyclelistener.
继续定位该类aprlifecyclelistener,发现是tomcat-embed-core-9.0.19.jar包下的东西,那为何会找不到呢?
<!--pom.xml--> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-tomcat</artifactid> <scope>provide</scope> </dependency>
这里的scope配置的是provide,也就是说,在编译打包时,lib里不会存在这个artifact,以防止与容器冲突。
然而在idea的时候,却因此读取不到这个class导致了问题(具体原因目前已触及我知识盲区)。
总之,把scope的值改为compile(默认值)即可,到发布正式环境时记得改回去就可以了(不需要配置tomcatservletwebserverfactory bean)。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论