# 一个个人习惯引发的问题
# 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>