对于调试,我需要查看实际的模块路径。如何在运行时打印出来?
问题:使用 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"));
除了路径不匹配的可能性之外,如果在一个环境中加载服务失败,则值得检查每个环境的上下文加载器,因为该方法 ServiceLoader.load(Class)使用上下文加载器进行搜索。
还要检查是否在旧的类路径上意外提供了模块的类。