# 一个个人习惯引发的问题

# 1. 有些人的个人习惯

由于 mybatis 的 mapper 映射文件和 dao 的一一对应关系,有些人习惯将 mapper 映射文件.xml和 dao 接口放在一起,并且命名为统一的名字。例如:

src
└── main
    └── java
        └── xxx
            └── yyy
                └── zzz
                    └── dao
                        ├── XxxDAO.java
                        ├── XxxDAOMapper.xml
                        ├── YyyDAO.java
                        ├── YyyDAOMapper.xml
                        ├── ZzzDAO.java
                        └── ZzzDAOMapper.xml

通常认为这不是一个很好的习惯,因为在 Maven 项目中,.xml.properties 一类的资源文件应该统一放在 resources 目录下,而非放在代码目录java下。

但是这么干也是有好处的,因为 DAO 和 DAOMapper 在一起,很方便一起找到它们俩,开发者多少还是能省点事的。

# 2. 问题及其原因

按照上述结构来组织代码时,在 spring 和 mybatis 的相关配置都正确的情况下,你运行项目会失败,报错信息会告诉你项目中的 Mapper.xml文件找不到!

如果你对 classpath 的概念很熟悉的话,那么你很显然会立刻想到到哪里去看、去验证是否真的没有 mapper 文件。

这里的原因在于,对于代码文件夹java目录下的文件,maven 默认只对 .java 文件做相关工作:编译成 .class 文件,并『搬』到 classpath 下。对于代码文件夹java目录下的非 .java 文件,maven 默认一概视而不见,不会帮你把它们『搬』到 classpath 下,就好似这些非 .java 文件不存在。

此时,需要你通过配置『告诉』maven 代码文件夹java目录,也承担资源文件夹resources的功能,要求 maven 帮我们『搬』文件。

# 3. 解决办法

pom.xml 文件的 <build>...</build> 中添加如下配置:

<resources>
    <resource>
       <directory>src/main/java</directory>
       <includes><!-- 你可以试试去掉这一段的效果 -->
            <include>**/*.xml</include>
       </includes>
    </resource>
    <resource>
       <directory>src/main/resources</directory>
    </resource>
</resources>