前言
在配置maven项目中碰到了很多一直忽视的问题,之前为了尽快部署项目,基本没仔细看配置信息,现在回过头来看看以前埋下的坑。比如target目录是干什么的?它是如何生成的?artifacts到底是个啥?还有war 和war exploded又是什么东西? classpath又是什么?。
要弄懂这些问题,首先要明白maven web项目时怎么运作的。(我用的是tomcat+maven+mysql+mybatis的整合)
target目录的生成
首先我们都知道tomcat是一个容器,在项目启动时jvm 会加载一个tomcat实例。然后maven会根据你的项目的发行方式来决定是把项目打包发到server 还是直接将项目的输出目录复制到 TOMCAT_HOME/webapp/ROOT/下 。这里的项目发行方式就是上面提到的war和war exploded 。
关于war和war exploded另一位仁兄做了更详细的介绍查看原文.
打开project structure
Artifacts指的就是项目的项目发行时产生的一些文件,可以看到我这里选择的是war exploded模式。
Output directory:输出目录。
Output layout:maven会把META-INF,WEB-INF文件夹中的数据放入ROOT目录,可以看到在WEB-INF下有个calsses文件夹,它就是等下要讲的classpath.然后facet resoures指的是一些webapp/下的其它资源文件。
我的项目结构是这样的:
在部署完毕后打开tomcat目录找到ROOT如下,果然都复制到了这里。
等这些文件被复制到tomcat中的ROOT/下后,spring开始控制项目进行一些初始化操作,从web.xml读取配置,寻找到servletContext,然后根据mvc-dispatcher.xml中的配置创建DispatcherServlet实例, 还有进行一些映射器的初始化。等所有准备工作开展完毕,并且确保无误后,项目自动开启测试的浏览器,然后就可以进行愉快地测试了。
classpath位置
在配置mvc-dispatcher.xml时有如下一段话:
这里的classpath指的是上面提到的生成target目录时,项目会将项目的一些资源整合到一起,然后将其放入target/项目/WEB-INF/classes/中 ,这就是所谓的classpath了。为什么这里可以这么配置呢?因为项目的mvc-dispatcher.xml 正好被复制到classpath/下了,可以看到上面我的mvc-dispatcher.xml放置在resources目录下,但是在class目录中却是没有了resources文件夹,直接被放置在了classes目录下。另外一种设置路径的方法就是设置成绝对路径。
总结:
根据artifacts中的配置,项目会被复制到target/中的某个位置,而classpath,也就是target/项目/WEB-INF/classes/。