环境说明: 系统:win10 专业版 开发环境:IDEA JDK版本:1.8 mysql:5.5 mybatis:3.5.3 Junit:5.7.0
问题再现:
Maven项目运行时报错,控制台报错信息如下:
代码语言:javascript复制java.lang.ExceptionInInitializerError
at com.langp.dao.UserMapperTest.getUserList(UserMapperTest.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
······
Caused by: org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### The error may exist in com/langp/dao/UserMapper.xml
Process finished with exit code -1
错误原因:
程序在编译过程中找不到对应的配置文件就会报错,但是对应的配置文件却是的的确确存在于项目中的,可是在生成的测试结果target对应目录下找不到对应配置文件,这是因为Maven项目中默认资源配置目录是src/main/resource,而实际有些配置文件会放在src/main/java目录下,就会导致项目编译时导出不了这些配置文件。所以我们需要手动配置资源过滤,使src/main/java的”.properties“文件和”.xml“文件可被导出到测试结果的target文件夹中。
解决方法:
最简单的方式就是将对应的Mapper.xml文件复制到生成测试结果的target文件夹下对应的目录中,但是只要在Maven中执行一次clear操作,target文件夹就被清除了,下次编译时还要重新复制过去。所以还有种更简单的方法:
在Maven项目的配置文件”pom.xml“中添加如下过滤配置信息:
代码语言:javascript复制<!-- 在build中配置resources,来防止资源导出失败的问题 -->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
然后,在IDEA中右键依次选择”Maven“->”Reload project“,重新载入依次Maven配置信息即可。