相信很多初学的新同学在Maven项目中配置Spring的配置文件时,总会遇到各种找不到的问题,其实理解Tomcat的加载机制,问题便会迎刃而解,那么我们来看Tomcat启动
是怎么一步步加载的.
首先Tomcat启动时,jvm的bootstrapLoader去加载java的标准库,这是通过我们配置环境变量即 JAVA_HOME来确定核心库的位置,接着会执行Tomcat bin目录的启动脚本
使用start参数调用 重写系统的classpath并加载 和 , 这些可以理解为Tomcat本身的东西,现在还没到我们的项目。接着Tomcat
会为每个Context创建ClassLoader .Tomcat 针对每个Context的默认classpath 是 WebApp/WEB-INF/ ,它会从当前目录下的class文件夹加载对应的class文件,会从lib文件下加载lib包.从根目录加载文件,接着开始加载.当然Servlet3.0可以不从开始加载,只要实现了 WebApplicationInitializer 这个接口的类,会在servlet启动时自动加载。
好了,现在我们走到了我们项目的入口即 ,在这里我将会配置自己想要的组件。在Maven项目中,配置文件放在Resource中是标准的做法, Resurce中的文件在编译好后会在WEB-INF/class/ 文件夹下,并不在根目录下的. 现在我们来看这种Spring 配置方法
- <servlet>
- <servlet-name>appServlet</servlet-name>
- <servlet-class></servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
当把配置文件放到webapp下时,这样是找不到配置文件的,因为classpath的查找范围是从/WEB-INF/classes中查找的,而把配置文件放到webapp下,编译后的位置是在/WEB-INF根目录下,所以会找不到文件。classpath 和 classpaht*的区别 , classpath* 会查找根目录下所有的文件,至到找到匹配文件即可。儿classpath只会在/WEB-INF/classes中查找。
其实最重要的是立即的Tomcat 的classpath. 千万不能看你源码目录结构来理解classpath. 因为Tomcat是跑的你编译后的目录。