前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >classpath* 和 classpath使用遇到的问题

classpath* 和 classpath使用遇到的问题

作者头像
haifeiWu
发布2018-09-11 10:17:22
3.6K0
发布2018-09-11 10:17:22
举报
文章被收录于专栏:haifeiWu与他朋友们的专栏

在spring配置mybatis的时候需要加载mybatis的多个相关配置文件,其中mybatis的mapper对应的xml通常放在其他的jar包中,mybatis-conf文件通常在当前工程中,so,也就引出了今天遇到的问题,那么classpath* 和 classpath到底有啥区别呢?

错误的配置与看到的异常

  1. 配置文件中的配置,看上去没啥问题 <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>
  2. 启动服务器之后看到的异常 Caused 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
  3. 分析异常,解决问题

从上面的异常可以看出来,文件很明显是找不到的,但是这是为啥呢?

从异常中可以看出来,spring查找的路径是:

代码语言:javascript
复制
然而这个路径根本不是我们想要的路径,显然是找错了地方。

但是我们配置文件给出的路径是:``` classpath*:/spring/mybatis-config.xml

我们将配置文件中下面的配置稍作修改,去掉classpath后面的 *

代码语言:javascript
复制
<property name="configLocation" value="classpath*:/spring/mybatis-config.xml"></property>

改为:

代码语言:javascript
复制
<property name="configLocation" value="classpath:/spring/mybatis-config.xml"></property>

之后,启动正常,没有报错,问题解决。到这里可能有的同学会说为啥 <property name="mapperLocations" value="classpath*:/mappings/*.xml"/>可以用classpath*呢?原因请看下面

classpath* 和 classpath的区别:

  1. classpath* 它会搜索所有的 classpath,找到所有符合条件的文件,包括当前项目依赖的jar文件中的配置文件。而classpath不会到当前项目依赖的jar文件中去寻找。
  2. classpath* 存在可移植性问题,遇到问题时,应该使用classpath。
  3. 一般情况下我们根本没有必要去使用classpath*,直接使用classpath就好了。
  4. <property name="mapperLocations" value="classpath*:/mappings/*.xml"/>中的value="classpath*:/mappings/*.xml"路径是当前项目依赖的jar包中的路径。

号外

楼主造了一个轮子,LIGHTCONF 是一个基于Netty实现的一个配置管理平台,其核心设计目标是“为业务提供统一的配置管理服务”,可以做到开箱即用。

作 者:haifeiWu

原文链接:https://cloud.tencent.com/developer/article/1333318

版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 错误的配置与看到的异常
  • classpath* 和 classpath的区别:
  • 号外
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档