Java 平台模块系统 (JPMS) 允许模块使用 module-info.java
文件中的 requires static
声明可选依赖项:
module my.module {
requires static some.optional.module;
}
但是,您应该如何在代码中检查模块在运行时是否存在?
Project Jigsaw: Optional Modules建议页面:
public boolean isModulePresent(String mn);
但是,它似乎被删除了,因为在最新的 Java 版本中没有这样的方法。我也找不到在当前 Java 版本中提到的 @RequireOptionalModule
注释。
This example on blog@CodeFX建议在 StackWalker
上使用一个非常冗长的方法链(解释为 here )。
编辑:该示例试图找出模块是否可用于调用者类,这在我的情况下不是必需的。
是否有更简单的方法来执行此检查,或者如果某个类的存在表明存在模块,则简单的 Class.forName
检查是否就足够了?
最佳答案
要查明某些模块在运行时是否可用,您可以简单地调用ModuleLayer.findModule()。 :
Optional<Module> module = ModuleLayer.boot().findModule("java.desktop");
System.out.println(module.isPresent());
如果您知道模块中某个特定类的名称,Class.forName()
也应该有效。但是,如果找不到类,forName()
将抛出 ClassNotFoundException
。这意味着您必须用 try-catch
包围它才能使其工作。这不是很方便。
关于java - 如何在运行时测试可选模块是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61703051/