mybatis-3-config.dtd 改为本地校验,避免无法启动
最近突然应用无法正常启动,报错信息如下:
2020-03-06 14:19:08.785 INFO [main] [---] o.s.b.f.xml.XmlBeanDefinitionReader :317 - Loading XML bean definitions from class path resource [mybatis-config/mybatis-setting.xml]org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Failed to import bean definitions from URL location [classpath:mybatis-config/mybatis-setting.xml]Offending resource: file [/usr/local/ics/conf/META-INF/spring/applicationContext.xml]; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [mybatis-config/mybatis-setting.xml]; nested exception is java.net.ConnectException: Connection timed out
根据错误信息Failed to import bean definitions
可以知道是加载定义文件超时,因此只要改为本地校验就可以解决。
找到mybatis-setting.xml
文件,找到头部定义如下:
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
修改为以下内容:
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"org/apache/ibatis/builder/xml/mybatis-3-config.dtd">
为什么这样修改,配置文件mybatis-setting.xml 定义中dtd校验文件是mybatis-3-config.dtd,因此找到mybatis3的jar包,并找到对应的dtd文件,请看以下图:
下面再分享下解决这个问题的过程:
- 首先根据报错信息判断是网络连接超时,且是由于加载dtd校验文件导致的。
- 于是各种搜索查找改为本地校验的方法。
- 最后在iteye中找到如下内容:
4. 参考文章中提到的,将链接改为:./mybatis-3-config.dtd
5. 改为启动报错如下,原因还是找不到文件:
Caused by: java.io.FileNotFoundException: class path resource [mybatis-3-config.dtd] cannot be opened because it does not exist
at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:172)
6. 当中尝试过把mybatis3的jar包中的dtd文件复制到跟mybatis-setting.xml同目录,启动依然报错;于是调度模式启动,断点设置在:ClassPathResource 162行。
7. 通过本段代码可以知道这边会通过类加载器获取本地文件,因此这个路径配置可以是类路径。于是就找到了mybatis3的jar包中的dtd文件。把对应的类路径写在mybatis-setting.xml中。启动成功。