天天看点

maven web 项目中关于artifacts,classpath,target的关系。

前言

    在配置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

maven web 项目中关于artifacts,classpath,target的关系。

 Artifacts指的就是项目的项目发行时产生的一些文件,可以看到我这里选择的是war exploded模式。

Output directory:输出目录。

Output layout:maven会把META-INF,WEB-INF文件夹中的数据放入ROOT目录,可以看到在WEB-INF下有个calsses文件夹,它就是等下要讲的classpath.然后facet resoures指的是一些webapp/下的其它资源文件。

我的项目结构是这样的:

maven web 项目中关于artifacts,classpath,target的关系。

在部署完毕后打开tomcat目录找到ROOT如下,果然都复制到了这里。

maven web 项目中关于artifacts,classpath,target的关系。

等这些文件被复制到tomcat中的ROOT/下后,spring开始控制项目进行一些初始化操作,从web.xml读取配置,寻找到servletContext,然后根据mvc-dispatcher.xml中的配置创建DispatcherServlet实例, 还有进行一些映射器的初始化。等所有准备工作开展完毕,并且确保无误后,项目自动开启测试的浏览器,然后就可以进行愉快地测试了。

classpath位置

在配置mvc-dispatcher.xml时有如下一段话:

maven web 项目中关于artifacts,classpath,target的关系。

这里的classpath指的是上面提到的生成target目录时,项目会将项目的一些资源整合到一起,然后将其放入target/项目/WEB-INF/classes/中 ,这就是所谓的classpath了。为什么这里可以这么配置呢?因为项目的mvc-dispatcher.xml 正好被复制到classpath/下了,可以看到上面我的mvc-dispatcher.xml放置在resources目录下,但是在class目录中却是没有了resources文件夹,直接被放置在了classes目录下。另外一种设置路径的方法就是设置成绝对路径。

maven web 项目中关于artifacts,classpath,target的关系。

总结:

根据artifacts中的配置,项目会被复制到target/中的某个位置,而classpath,也就是target/项目/WEB-INF/classes/。