项目场景:
一个用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下
重要的事情说三遍!!!