一、问题浮现:
在构建maven+mybatis项目时,遇到个问题,就是接口dao无法找到对应的mapper.xml文件,
项目结构及注解配置的均没有问题。但是调用接口就会发生异常,报找不到接口对应的mapper文件。查资料后,又把
mybatis.mapper-locations=classpath:com.yk.springsecuritydemo.mapper/*.xml
改为了
mybatis.mapper-locations=classpath:com/yk/springsecuritydemo/mapper/*.xml
还是不行。
于是我把sql直接写在了dao接口的方法上,这次竟然成功了!说明注解写的都没有问题,心里一万个不解。
后来忽然想起来是不是目录编译问题。
于是查资料发现,src/main/java目录默认只能编译java文件,src/main/resources目录才能编译配置文件。验证一下,把mapper.xml放到src/main/resources下,配置文件路径修改一下,重启项目,成功!
二、相关知识
maven项目目录结构:
src/main/java默认加载java文件,所以这个目录在开发时一般只放java文件。
src/main/resources目录放置项目中的各种配置文件及静态资源,如html页面、yml文件、properties文件、css文件、js文件、xml文件等。
下面再说说项目中经常用到的classpath:这个词
首先介绍一下maven项目打包后的目录:
src目录就是开发的代码都在这里面,target目录是编译文件输出目录。
可以看到,编译后src/main目录下的java目录和resources目录中的文件都到target/classes目录下了,其中,是src/main/java下的目录直接复制到了项目根目录,src/main/resources下面的文件也是全部复制到了项目的根目录下
了解完maven项目编译后各文件及包的存放规则就很容易知道classpath的意思了。
classpath的意思是项目根路径,也就是target/classes。
三、出现该问题的原因思考
但是默认情况下,src/main/java下的非java文件不会编译到target/classes/com/...对应的路径下,如下图:
编译完后发现,target/classes/com/yk/springsecuritydemo/mapper目录下没有UserInfoMapper.xml。这是因为src/main/java目录默认只能编译java文件,不能编译mapper.xml,所以一开始把mapper文件放在src/main/java目录下就会找不到mapper文件,但是放在src/main/resources目录下就能找到。
有人会问,我偏不想把mapper文件放在src/main/resources下,我就要放在src/main/java下,怎么办?
需要在pom.xml配置一下:
<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include> </includes> </resource> </resources> </build>
就可以把java路径下的xml文件编译到对应的class目录中了