BUG——java.lang.NoClassDefFoundError: com/sap/conn/jco/JCoException

项目场景:

一个用Spring,SpringMVC,Mybatis写的项目


问题描述:

今天把这个项目放到服务器上跑,发现无法访问静态资源(但jsp文件可以访问)。控制台报错如下:

Caused by: java.lang.NoClassDefFoundError: com/sap/conn/jco/JCoException
		at java.lang.Class.getDeclaredMethods0(Native Method)
		at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
		at java.lang.Class.getDeclaredMethods(Class.java:1975)
		at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:613)
		at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:524)
		at org.springframework.core.MethodIntrospector.selectMethods(MethodIntrospector.java:68)
		at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:230)
		at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:214)
		at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:184)
		at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:127)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
		at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
		... 36 more

分析以及解决过程:

一开始我也没看报错原因,以为是SpringMVC的DispatcherServlet拦截了静态资源请求,但我发现SpringMVC的配置文件里配置resources(如下图),所以应该是别的问题.
  <mvc:resources mapping="/static/**" location="/static/" cache-period="31556926"/>

后来分析了报错原因,觉得应该是jar包导入的问题,于是去maven配置文件中找到了如下dependency

 <dependency>
     <groupId>com.sap</groupId>
     <artifactId>sapjco3</artifactId>
     <version>${sapjco.version}</version>
     <scope>system</scope>
     <systemPath>${pom.basedir}/src/main/resources/lib/sapjco3.jar</systemPath>
 </dependency>

然后我就分析了systemPath,去目录中找到jar位置
在这里插入图片描述
当时我也奇怪,为什么jar包放这里,不是应该放到WEB-INF/lib下面吗?然后我就把lib移到WEB-INF下面了,并且修改了systemPath(如下图)

  <dependency>
    <groupId>com.sap</groupId>
    <artifactId>sapjco3</artifactId>
    <version>${sapjco.version}</version>
    <scope>system</scope>
    <systemPath>${pom.basedir}/src/main/webapp/WEB-INF/lib/sapjco3.jar</systemPath>
  </dependency>

于是就解决了,虽然是挺简单的,但当时我确实搞了好久。果然是编程五分钟,改错两小时!

原因分析

web项目是在服务器下运行的,我们导的包必须让服务器找到,而服务器默认去寻找jar包的路径是WEB_INF/lib(必须是lib,区分大小写,要一模一样),如果我们不放在这里,服务器就会找不到依赖。

总结

web项目jar包要放到WEB-INF/lib下
web项目jar包要放到WEB-INF/lib下
web项目jar包要放到WEB-INF/lib下
重要的事情说三遍!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值