且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

更新时间:2021-09-17 21:44:03

一、问题浮现:

在构建maven+mybatis项目时,遇到个问题,就是接口dao无法找到对应的mapper.xml文件,

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

项目结构及注解配置的均没有问题。但是调用接口就会发生异常,报找不到接口对应的mapper文件。查资料后,又把

mybatis.mapper-locations=classpath:com.yk.springsecuritydemo.mapper/*.xml

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

改为了

mybatis.mapper-locations=classpath:com/yk/springsecuritydemo/mapper/*.xml

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

还是不行。

于是我把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目录是编译文件输出目录。

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

可以看到,编译后src/main目录下的java目录和resources目录中的文件都到target/classes目录下了,其中,是src/main/java下的目录直接复制到了项目根目录,src/main/resources下面的文件也是全部复制到了项目的根目录下

了解完maven项目编译后各文件及包的存放规则就很容易知道classpath的意思了。

classpath的意思是项目根路径,也就是target/classes。

三、出现该问题的原因思考

但是默认情况下,src/main/java下的非java文件不会编译到target/classes/com/...对应的路径下,如下图:

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

编译完后发现,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>

关于maven项目src/main/java目录下mapper文件不生效的问题解决方法

就可以把java路径下的xml文件编译到对应的class目录中了