通常在自己编写代码解析指定的配置文件时,为了定位文件的路径会用到使用 Java 代码获取项目路径和
classpath的情况。
Java 中获取 classpath
package org.company.demo;
import lombok.extern.slf4j.Slf4j;
import java.net.URL;
@Slf4j
public class ClassPathDemo {
public static void main(String[] args) {
// 获取当前项目工程路径
String projectPath = System.getProperty("user.dir");
System.out.println(projectPath); // F:\work\demo\codetest
// 获取当前 classPath
URL classPath = ClassPathDemo.class.getResource("/");
System.out.println(classPath.toString()); // file:/F:/work/demo/codetest/target/classes/
System.out.println(classPath.getPath()); // //F:/work/demo/codetest/target/classes/
// 获取当前 classPath 等同上一行代码
URL classPathByClassLoader = ClassPathDemo.class.getClassLoader().getResource("");
System.out.println(classPathByClassLoader.toString()); // file:/F:/work/demo/codetest/target/classes/
System.out.println(classPathByClassLoader.getPath()); // /F:/work/demo/codetest/target/classes/
//获取当前类基于 classPath 的完整路径
URL classFullPath = ClassPathDemo.class.getResource("");
System.out.println(classFullPath); // file:/F:/work/demo/codetest/target/classes/org/company/demo/
System.out.println(classFullPath.getPath()); // /F:/work/demo/codetest/target/classes/org/company/demo/
}
}

项目结构
Spring 配置中的 classpath: 与 classpath*: 的区别
-
classpath::表示从类路径中加载资源。classpath:和classpath:/是等价的,都是相对于类的根路径。资源文件库标准的在文件系统中,也可以在JAR或ZIP的类包中。 -
classpath*::假设多个JAR包或文件系统类路径都有一个相同的配置文件,classpath:只会在第一个加载的类路径下查找,而classpath*:会扫描所有这些JAR包及类路径下出现的同名文件。
在多个
classpath中存在同名资源,都需要加载时,那么用classpath:只会加载第一个,这种情况下也需要用classpath*:前缀。