You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

运行时如何获取--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:01:35