Maven 项目的 classpath 理解

    相信很多初学的新同学在Maven项目中配置Spring的配置文件时,总会遇到各种找不到的问题,其实理解Tomcat的加载机制,问题便会迎刃而解,那么我们来看Tomcat启动

是怎么一步步加载的.

    首先Tomcat启动时,jvm的bootstrapLoader去加载java的标准库,这是通过我们配置环境变量即 JAVA_HOME来确定核心库的位置,接着会执行Tomcat bin目录的启动脚本

Startup.sh 使用start参数调用 Catalina.sh 重写系统的classpath并加载 bootstarp.jar 和 tomcat-juli.jar, 这些可以理解为Tomcat本身的东西,现在还没到我们的项目。接着Tomcat 

会为每个Context创建ClassLoader .Tomcat 针对每个Context的默认classpath 是 WebApp/WEB-INF/ ,它会从当前目录下的class文件夹加载对应的class文件,会从lib文件下加载lib包.从根目录加载web.xml文件,接着开始加载.当然Servlet3.0可以不从web.xml开始加载,只要实现了  WebApplicationInitializer  这个接口的类,会在servlet启动时自动加载。

   好了,现在我们走到了我们项目的入口即web.xml ,在这里我将会配置自己想要的组件。在Maven项目中,配置文件放在Resource中是标准的做法, Resurce中的文件在编译好后会在WEB-INF/class/ 文件夹下,并不在根目录下的. 现在我们来看这种Spring 配置方法

  1.     <servlet>  
  2.         <servlet-name>appServlet</servlet-name>  
  3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.         <init-param>  
  5.             <param-name>contextConfigLocation</param-name>  
  6.             <param-value>classpath:servlet-context.xml</param-value>  
  7.         </init-param>  
  8.         <load-on-startup>1</load-on-startup>  
  9.     </servlet>  

当把配置文件放到webapp下时,这样是找不到配置文件的,因为classpath的查找范围是从/WEB-INF/classes中查找的,而把配置文件放到webapp下,编译后的位置是在/WEB-INF根目录下,所以会找不到文件。classpath 和 classpaht*的区别 , classpath* 会查找根目录下所有的文件,至到找到匹配文件即可。儿classpath只会在/WEB-INF/classes中查找。

  其实最重要的是立即的Tomcat 的classpath. 千万不能看你源码目录结构来理解classpath. 因为Tomcat是跑的你编译后的目录。

      转载自:https://blog.csdn.net/geyuezhen/article/details/52609369

    相信很多初学的新同学在Maven项目中配置Spring的配置文件时,总会遇到各种找不到的问题,其实理解Tomcat的加载机制,问题便会迎刃而解,那么我们来看Tomcat启动

是怎么一步步加载的.

    首先Tomcat启动时,jvm的bootstrapLoader去加载java的标准库,这是通过我们配置环境变量即 JAVA_HOME来确定核心库的位置,接着会执行Tomcat bin目录的启动脚本

Startup.sh 使用start参数调用 Catalina.sh 重写系统的classpath并加载 bootstarp.jar 和 tomcat-juli.jar, 这些可以理解为Tomcat本身的东西,现在还没到我们的项目。接着Tomcat 

会为每个Context创建ClassLoader .Tomcat 针对每个Context的默认classpath 是 WebApp/WEB-INF/ ,它会从当前目录下的class文件夹加载对应的class文件,会从lib文件下加载lib包.从根目录加载web.xml文件,接着开始加载.当然Servlet3.0可以不从web.xml开始加载,只要实现了  WebApplicationInitializer  这个接口的类,会在servlet启动时自动加载。

   好了,现在我们走到了我们项目的入口即web.xml ,在这里我将会配置自己想要的组件。在Maven项目中,配置文件放在Resource中是标准的做法, Resurce中的文件在编译好后会在WEB-INF/class/ 文件夹下,并不在根目录下的. 现在我们来看这种Spring 配置方法

  1.     <servlet>  
  2.         <servlet-name>appServlet</servlet-name>  
  3.         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.         <init-param>  
  5.             <param-name>contextConfigLocation</param-name>  
  6.             <param-value>classpath:servlet-context.xml</param-value>  
  7.         </init-param>  
  8.         <load-on-startup>1</load-on-startup>  
  9.     </servlet>  

当把配置文件放到webapp下时,这样是找不到配置文件的,因为classpath的查找范围是从/WEB-INF/classes中查找的,而把配置文件放到webapp下,编译后的位置是在/WEB-INF根目录下,所以会找不到文件。classpath 和 classpaht*的区别 , classpath* 会查找根目录下所有的文件,至到找到匹配文件即可。儿classpath只会在/WEB-INF/classes中查找。

  其实最重要的是立即的Tomcat 的classpath. 千万不能看你源码目录结构来理解classpath. 因为Tomcat是跑的你编译后的目录。

      转载自:https://blog.csdn.net/geyuezhen/article/details/52609369

猜你喜欢

转载自blog.csdn.net/itcats_cn/article/details/81870289