classpath* 和 classpath使用遇到的问题
作 者:
原文链接:https://www.hchstudio.cn/article/2018/ccf6/
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
在spring配置mybatis的时候需要加载mybatis的多个相关配置文件,其中mybatis的mapper对应的xml通常放在其他的jar包中,mybatis-conf文件通常在当前工程中,so,也就引出了今天遇到的问题,那么classpath* 和 classpath到底有啥区别呢?
错误的配置与看到的异常
配置文件中的配置,看上去没啥问题
1
2
3
4
5<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceM"/>
<property name="mapperLocations" value="classpath*:/mappings/*.xml"/>
<property name="configLocation" value="classpath*:/spring/mybatis-config.xml"></property>
</bean>启动服务器之后看到的异常
1
2
3
4
5
6
7Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/classpath*:/spring/mybatis-config.xml]
at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:141)
at org.mybatis.spring.SqlSessionFactoryBean.buildSqlSessionFactory(SqlSessionFactoryBean.java:358)
at org.mybatis.spring.SqlSessionFactoryBean.afterPropertiesSet(SqlSessionFactoryBean.java:340)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
... 61 more分析异常,解决问题
从上面的异常可以看出来,文件很明显是找不到的,但是这是为啥呢?
从异常中可以看出来,spring查找的路径是:1
2
3
4
然而这个路径根本不是我们想要的路径,显然是找错了地方。
但是我们配置文件给出的路径是:``` classpath*:/spring/mybatis-config.xml
我们将配置文件中下面的配置稍作修改,去掉classpath后面的 *1
<property name="configLocation" value="classpath*:/spring/mybatis-config.xml"></property>
改为:
1 | <property name="configLocation" value="classpath:/spring/mybatis-config.xml"></property> |
之后,启动正常,没有报错,问题解决。到这里可能有的同学会说为啥 <property name="mapperLocations" value="classpath*:/mappings/*.xml"/>可以用classpath*呢?原因请看下面
classpath* 和 classpath的区别:
classpath*它会搜索所有的 classpath,找到所有符合条件的文件,包括当前项目依赖的jar文件中的配置文件。而classpath不会到当前项目依赖的jar文件中去寻找。classpath* 存在可移植性问题,遇到问题时,应该使用classpath。
一般情况下我们根本没有必要去使用classpath*,直接使用classpath就好了。
<property name="mapperLocations" value="classpath*:/mappings/*.xml"/>中的value="classpath*:/mappings/*.xml"路径是当前项目依赖的jar包中的路径。
号外
楼主造了一个轮子,LIGHTCONF 是一个基于Netty实现的一个配置管理平台,其核心设计目标是“为业务提供统一的配置管理服务”,可以做到开箱即用。

作 者:
原文链接:https://www.hchstudio.cn/article/2018/ccf6/
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。
