运行时如何获取--module-path/-p参数指定的模块路径目录列表?
获取运行时模块路径目录列表的方法
当然有办法实现啦!在Java模块系统中,想要获取通过-p或--module-path指定的模块路径列表,有两种常用思路,下面分别介绍:
方法一:通过模块系统API获取已加载模块的位置
这种方式会拿到实际被JVM加载的模块所在的路径,这些路径都是来自你指定的模块路径。代码示例如下:
import java.util.Set; import java.util.stream.Collectors; public class ModulePathReader { public static void main(String[] args) { // 获取启动模块层的配置信息 ModuleLayer bootLayer = ModuleLayer.boot(); Set<String> moduleLocations = bootLayer.configuration().modules().stream() // 获取模块引用 .map(module -> module.reference().location()) // 过滤掉没有位置的模块(比如部分系统模块可能没有) .filter(location -> location.isPresent()) // 转换为字符串路径 .map(location -> location.get().toString()) .collect(Collectors.toSet()); System.out.println("已加载模块的位置(来自模块路径):"); moduleLocations.forEach(System.out::println); } }
说明
这段代码会遍历启动模块层中的所有模块,提取每个模块的实际位置。输出的是具体的模块JAR文件或模块目录路径,这些都是你通过-p/--module-path指定的目录下的内容。
方法二:解析JVM启动参数获取原始模块路径
如果你想要更贴近System.getProperty("java.class.path")的效果——直接拿到启动时传入的模块路径原始值,可以通过RuntimeMXBean提取并解析启动参数:
import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.util.List; public class RawModulePathReader { public static void main(String[] args) { RuntimeMXBean runtimeBean = ManagementFactory.getRuntimeMXBean(); List<String> jvmArgs = runtimeBean.getInputArguments(); String rawModulePath = null; // 遍历所有JVM启动参数,查找模块路径参数 for (int i = 0; i < jvmArgs.size(); i++) { String arg = jvmArgs.get(i); // 处理 -p 或 --module-path 两种形式 if ("-p".equals(arg) || "--module-path".equals(arg)) { if (i + 1 < jvmArgs.size()) { rawModulePath = jvmArgs.get(i + 1); break; } } // 处理 -p=xxx 或 --module-path=xxx 的简写形式 else if (arg.startsWith("--module-path=")) { rawModulePath = arg.substring("--module-path=".length()); break; } else if (arg.startsWith("-p=")) { rawModulePath = arg.substring("-p=".length()); break; } } if (rawModulePath != null) { System.out.println("原始模块路径参数值:"); System.out.println(rawModulePath); // 拆分路径为单个目录/文件 String[] splitPaths = rawModulePath.split(System.getProperty("path.separator")); System.out.println("\n拆分后的模块路径目录:"); for (String path : splitPaths) { System.out.println(path); } } else { System.out.println("当前JVM未通过 -p/--module-path 指定模块路径"); } } }
说明
这种方式直接从JVM启动参数中提取你传入的模块路径字符串,再分割成单个路径项。得到的结果和你启动时输入的-p参数内容完全一致,不管模块是否被加载,更符合你想要的类似java.class.path的使用场景。
两种方法的对比
- 方法一更适合关注已加载模块的实际位置,比如需要确认某个模块是否来自指定路径;
- 方法二更适合获取原始的模块路径配置值,和类路径的获取方式逻辑一致。
内容的提问来源于stack exchange,提问作者Artem Petrov
相关产品推荐
相关产品推荐

