java - 如何在运行时测试可选模块是否存在

标签 java java-module java-platform-module-system

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/

相关文章:

java - 从外部模块访问资源文件

java - 如何使用泛型函数参数

java - 基于 ChoiceBox 选择过滤 observableArrayList

windows - 如何使用 javapackager 生成模块化 Java 应用程序的可执行文件?

java - 未命名模块通过 ServiceLoader::load 与命名模块交互

java - 与 Java 模块 (JPMS) 和 Gradle 一起使用时出现 log4j2 配置问题

java - 为什么Maven找不到org.json JPMS自动模块?

java - 如何从移动元素创建变量?

Java - 使用通用参数调用存储过程

java - 如何使用 Java 11 运行已编译的 Java 8 JavaFX 应用程序 jar?