码迷,mamicode.com
首页 > 编程语言 > 详细

Caused by: java.lang.NoClassDefFoundError:

时间:2019-06-29 20:45:34      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:ogg   eva   $$   miss   stp   isp   gap   text   edm   

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘identityService‘: Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [com.example.new_oa.identity.service.impl.IdentityServiceImpl] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2] Caused by: java.lang.NoClassDefFoundError: javax/servlet/http/HttpSession at java.lang.Class.getDeclaredMethods0(Native Method) ~[na:1.8.0_181] at java.lang.Class.privateGetDeclaredMethods(Class.java:2701) ~[na:1.8.0_181] at java.lang.Class.getDeclaredMethods(Class.java:1975) ~[na:1.8.0_181] at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:641) ~[spring-core-5.0.4.RELEASE.jar:5.0.4.RELEASE] ... 20 common frames omitted Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpSession at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_181] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_181] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_181] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_181] ... 24 common frames omitted

当使用idea开发工具时,maven作为项目管理工具时,idea是默认不提供servlet-api.jar的,所以当javax.servlet-api的scope的值设置provide(表示该jar在编译时需要,而在发布时不需要)时会提示找不到对应的jar包,我这里是提示不能创建对应的service,是因为我的类中用到了HttpSession,依赖于servelt-api.jar.只需要把provide注释掉即可。
技术图片
但是,注释掉之后,又出现了其他问题:如下:
Bean ‘org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration‘ of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$723b5875] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2019-06-29 20:05:39.786 WARN 4452 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
2019-06-29 20:05:39.794 INFO 4452 --- [ main] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug‘ enabled.
Disconnected from the target VM, address: ‘127.0.0.1:49637‘, transport: ‘socket‘
2019-06-29 20:05:39.803 ERROR 4452 --- [ main] o.s.boot.SpringApplication : Application run failed

org.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:155) ~[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543) ~[spring-context-5.0.4.RELEASE.jar:5.0.4.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.0.RELEASE.jar:2.0.0.RELEASE]
技术图片
即在启动applicationContext容器失败。解决办法和上面大致一样。如下图:
技术图片

在本地启动一个新项目时,
报错: java.lang.ClassNotFoundException: javax.servlet.Filter
环境intellJ idea,我同事的myeclipse就可以直接启动

最后搜了下问题
问题原因是:spring boot项目中引入使用的是scope=provided
而默认情况下,idea是不会提供对应的servlet-api.jar包eclipse会提供

网上有人说这是idea的bug,这么说显然是不对的,是完全没有理解provided和compile的区别
对于scope=compile的情况(默认scope),也就是说这个项目在编译,测试,运行阶段都需要这个artifact对应的jar包在classpath中。而对于scope=provided的情况,则可以认为这个provided是目标容器已经provide这个artifact。

??????? 这么说可能不是很好理解:换个简单的,就是你在把这个项目打成war包时,scope=provided的jar包,不会出现在WEB-INFO/lib目录下,而scope=compile的jar包,会放到WEB-INFO/lib目录

??????? 这样可以避免想servlet-api.jar这样的jar包冲突,但是如果遇到idea下默认不提供servlet-api.jar时,使用scope=provided就会缺少对应的jar包,也就是我遇到的问题找不到类

Caused by: java.lang.NoClassDefFoundError:

标签:ogg   eva   $$   miss   stp   isp   gap   text   edm   

原文地址:https://blog.51cto.com/14423206/2415410

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!