通常在自己编写代码解析指定的配置文件时,为了定位文件的路径会用到使用 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*:
前缀。