跳过正文
  1. 文章/

classpath* 和 classpath 使用遇到的问题

haifeiWu
作者
haifeiWu
北京后端开发者,热爱分布式系统、中间件与 AI 工程,正在深入学习 Go 与 Rust。
目录

📌 本文原发布于掘金社区:classpath* 和 classpath 使用遇到的问题

在 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 查找的路径是:

然而这个路径根本不是我们想要的路径,显然是找错了地方。

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

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

<property name="configLocation" value="classpath*:/spring/mybatis-config.xml"></property>

改为:

<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 就好了。

号外
#

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

相关文章