如何显示实际的模块路径?

how to show the actual modulepath?

为了调试,我需要查看实际的模块路径。如何在运行时打印出来?

问题:使用 ServiceLoader 根据定义的 API 加载模块在正常运行时环境中工作正常,但在测试中无效。我得找出原因。

由于我是 ServiceLoader 的新手,所以在模块路径上找到提供程序模块可能还不够。但是,我的第一个问题是:即使在测试环境中,它是否在模块路径上?

当你想检查模块是否存在时,可以直接检查模块是否存在,例如

String moduleName = "java.compiler";
ModuleLayer.boot().findModule(moduleName)
    .ifPresentOrElse(
        m -> System.out.println(m + " loaded via " + m.getClassLoader()),
        () -> System.out.println(moduleName + " not found"));

当模块不存在时,您可以使用非标准系统检查模块路径属性,

System.out.println(System.getProperty("jdk.module.path"));

除了路径不匹配的可能性之外,值得检查 context loader of each envi­ron­ment if loading a service fails in one environment, as the method ServiceLoader.load(Class) uses the context loader 进行搜索。

还要检查模块的 classes 是否意外地提供在旧的 class 路径上。