如何在运行时测试可选模块是否存在
How to test whether an optional module is present at runtime
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 suggests a quite verbose method chain on StackWalker
(which is explained here).
编辑:该示例试图找出模块是否可供调用者使用 class,这在我的情况下不是必需的。
是否有更简单的方法来执行此检查,或者如果某个 class 的存在表明存在模块,则简单的 Class.forName
检查是否足够?
要查明某个模块在运行时是否可用,您只需调用 ModuleLayer.findModule():
Optional<Module> module = ModuleLayer.boot().findModule("java.desktop");
System.out.println(module.isPresent());
如果您知道模块中某些特定 class 的名称,Class.forName()
也应该有效。但是,如果未找到 class,forName()
将抛出 ClassNotFoundException
。这意味着您必须用 try-catch
包围它才能使其工作。这不是很方便。
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 suggests a quite verbose method chain on StackWalker
(which is explained here).
编辑:该示例试图找出模块是否可供调用者使用 class,这在我的情况下不是必需的。
是否有更简单的方法来执行此检查,或者如果某个 class 的存在表明存在模块,则简单的 Class.forName
检查是否足够?
要查明某个模块在运行时是否可用,您只需调用 ModuleLayer.findModule():
Optional<Module> module = ModuleLayer.boot().findModule("java.desktop");
System.out.println(module.isPresent());
如果您知道模块中某些特定 class 的名称,Class.forName()
也应该有效。但是,如果未找到 class,forName()
将抛出 ClassNotFoundException
。这意味着您必须用 try-catch
包围它才能使其工作。这不是很方便。