在使用idea+maven搭建ssm(即spring+springMVC+mybatis)的时候遇到两个问题。
一、spirng和mybatis的配置文件放在哪里?
二、src/main/java/下的xxMapper.xml不编译,那么xxMapper.xml应该放在哪里?
之前不用maven,所以直接在src下,创建一个resource包或者config包亦或者mapping包,将xml放在那里,然后配置路径的时候使用classpath:resource/xxx.xml即可。然而在使用maven之后,以上办法是行不通,根据你的操作不同,会有各种不同的报错。当然以上两条其实是一个问题,只是在我整个过程中,对于以上两个错误,分别采用了两种方法解决。
理解maven在构建时,默认只会编译src/main/java下的java文件和src/main/resource的资源文件(在idea下,你需要把前者标记为Sources,后者标记为Resources,后面补上如何标记)。既然有默认配置,那么就可以修改默认。
在解决第一个问题的时候,我将spirng和mybatis的配置文件放在了,/WEB-INF/下面。因为springMVC是会默认读取/WEB-INF/applicationContext.xml。所以项目是可以找到/WEB-INF/这个路径的。因此在配置springmvc的时候,可以如下图配置
配这个图,重点是想说明一下maven项目下,/WEB-INF/下的资源文件也是会编译的,能够被项目正确的读取到(自动请忽略掉配置的mybatis)
第一个问题算是解决了,那么第二个问题来了。像这种spirngmvc这样的全局式的配置文件放在/WEB-INF/下还勉强可以理解,但是xxxmapper.xml这种非全局性的配置,而且个数还很多,放在/WEB-INF/下就显得不美观,结构也不够清晰。
先来看两张对比图,两张图都分为左中右部分,左边是项目源码目录结构,中间是编译后的目录结构,右边是项目的.pom文件的build标签里的内容
第一张为无法编译的效果图,第二张是可以编译的。为什么无法编译?因为maven项目是默认只编译src/main/java下的.java文件,和src/main/resources下的资源文件(如.xml和.properties文件)。准确的来说,应该是maven项目只编译sources类型文件夹的java文件,和resources类型文件夹下的资源文件。
既然知道是默认情况后,自然可以更改设置。即第一张图右侧被注释掉的代码,如下
src/main/java
**/*.xml
**/*.properties
false
.pom文件里有了这段代码后,就可以编译包下面的xxMapper.xml了。同理,spring,mybatis的配置文件也同样可以被编译了,也就没有必要非要放在/WEB-INF下面了。
写到这里,开篇提出的两个问题就解决完了。
当然,更改pom文件,配置maven编译的文件的路径是一种方法。还有另外两种方法,也能够将UserMapper.xml编译那个位置。
一、在src/main/resources/下新建一个com文件夹,再在里面新建mapper文件夹(因为我的xxMappper.xml是在com.mapper包下),然后将xxMappper.xml移动到/ src/main/resources/com/mapper,这种情况下pom文件里就不需要再配置resources那串代码,这样也是能编译的。
二、在src/main/java下面新建一个包com.mapping,专门用来放xxMapper.xml文件。然后,将这个包标记为Resources.不过既然路径改变了,接口和映射文件对应的时候,路径也要改变,这里完全是mybatis的内容,就不详说了。
本以为编译后也会在com下面有个mapping文件夹,可惜并没有,而是直接在classes下面直接编译了userMapper.xml文件。所以这个时候UserMapper的文件路径应该是 “classpath*:UserMapper.xml”,而不是 “classpath:com/mapping/ UserMapper.xml”.不过这样一来,就没办法配置自动扫描xxMapper.xml,而是需要手动配置引入xxMapper.xml。
另外,文章提到将文件夹分为了sources和resources两种类型(笔者自己这样分类,官方是否有这样的分类,不清楚),sources下java文件,resources下的资源文件才会被编译。如何标记这些类型?idea下,右键目标文件夹,选择底部Mark Director As,然后选择要标记的类型。
1.maven项目下,sources下的java文件,resources下的资源文件才会被编译。
2.maven项目下,会将resources类型的文件夹作为 资源文件的根目录,编译之后,资源文件是直接在classes下的。例如 将com.config标记为resources类型,里面有个applicationContent.xml.那么它的路径应该 classpath:applicatoinContent.xml(也有可能是classpath*:applicationContent.xml,有空再研究classpath与classpath*的区别,读者可百度),而不是classpath:com/config/applicationContent.xml