classpath(类路径)是 Java 虚拟机(JVM)用于查找类文件(.class) 和资源文件(如 .xml、.properties 等) 的路径集合。当程序运行时,JVM 会从 classpath 中搜索需要加载的资源,它是 Java 程序访问资源的 “基准路径”。
这与 Maven/Gradle 等构建工具的默认目录约定和编译打包规则直接相关。
标准的 Maven 项目目录结构如下:
src/
├── main/
│ ├── java/ // 存放 Java 源代码(.java 文件)
│ └── resources/ // 存放资源文件(.xml、.properties 等)
└── test/...
当使用 Maven 编译项目时(执行 mvn compile),会将:
src/main/java 中的 .java 文件编译为 .class 文件,输出到 target/classes 目录;
src/main/resources 中的资源文件直接复制到 target/classes 目录(不编译,保持原格式)。
target/classes/
├── com/
│ └── example/ // 编译后的 .class 文件(对应 src/main/java 中的包结构)
│ ├── model/
│ ├── mapper/
│ └── ...
└── mapper/ // 从 resources 复制过来的资源文件
└── UserMapper.xml
Java 程序运行时,classpath 会默认指向编译后的 target/classes 目录(或打包后的 JAR 包内部,JAR 包本质是压缩的 target/classes 结构)。因此:
src/main/resources 中的资源文件,编译后位于 target/classes 下,自然被包含在 classpath 中;
- 程序通过
classpath:xxx 查找资源时,实际就是在 target/classes 目录中查找。
结合上面的编译结果,classpath:mapper/*.xml 表示:
- 从
classpath 根路径(即 target/classes)开始,查找所有在 mapper 文件夹下的 .xml 文件。
- 对应到开发时的目录,就是
src/main/resources/mapper 文件夹下的所有 .xml 文件(因为编译后它们会被复制到 target/classes/mapper 中)。
classpath 是 JVM 查找资源的基准路径,在 Spring Boot 项目中默认指向编译后的 target/classes 目录(或 JAR 包内部);
src/main/resources 目录的资源文件会被复制到 target/classes,因此属于 classpath 范围;
classpath:mapper/*.xml 本质是告诉 MyBatis:“去 classpath 下的 mapper 文件夹中,加载所有 .xml 映射文件”,对应开发时的 src/main/resources/mapper 目录。
最终 target/classes 目录的结构如下(假设 resources 下有 mapper/UserMapper.xml):