Java 获取 Classpath 的方法
在 Java 中获取 classpath(类路径)有几种常见的方法,以下是几种主要方式:

(图片来源网络,侵删)
使用 System.getProperty()
String classpath = System.getProperty("java.class.path");
System.out.println("Classpath: " + classpath);
这种方法会返回一个包含所有 classpath 条目的字符串,条目之间由系统特定的路径分隔符(Windows 是分号,Linux/Mac 是冒号)分隔。
使用 ClassLoader 的方法
获取类加载器
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
获取资源 URL
// 获取单个资源的URL
URL resourceUrl = classLoader.getResource("filename.txt");
if (resourceUrl != null) {
System.out.println("Resource URL: " + resourceUrl);
}
// 获取所有资源的URL(用于同名资源在不同位置的情况)
Enumeration<URL> resources = classLoader.getResources("filename.txt");
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
System.out.println("Found resource: " + url);
}
获取 classpath 中的所有路径
// 对于Java 9+
if (classLoader instanceof URLClassLoader) {
URL[] urls = ((URLClassLoader) classLoader).getURLs();
System.out.println("Classpath entries:");
for (URL url : urls) {
System.out.println(url);
}
}
使用 Java 9+ 的 ModuleLayer
对于 Java 9 及更高版本,可以使用模块系统:
ModuleLayer layer = ModuleLayer.boot();
layer.modules().forEach(module -> {
System.out.println("Module: " + module.getName());
module.getConfiguration().modules().stream()
.filter(m -> m.name().equals(module.getName()))
.findFirst()
.ifPresent(m -> m.reads().forEach(r -> System.out.println(" Reads: " + r.name())));
});
获取当前工作目录
虽然不是直接获取 classpath,但有时需要知道当前工作目录:
String workingDir = System.getProperty("user.dir");
System.out.println("Working directory: " + workingDir);
注意事项
- 安全性:在安全受限的环境中,某些 classpath 访问操作可能会被限制
- 模块系统:Java 9+ 引入了模块系统,classpath 的概念有所变化
- 多类加载器:应用中可能有多个类加载器,每个可能有不同的 classpath
- 动态类加载:动态添加的 JAR 或目录可能不会出现在默认 classpath 中
选择哪种方法取决于你的具体需求,如果你只是想查看 classpath 的内容,第一种方法最简单;如果你需要以编程方式访问资源,第二种方法更合适。

(图片来源网络,侵删)

(图片来源网络,侵删)
