Java Gradle 缺少存在或已导入的库模块 -> 任务:编译Java

Java Gradle Missing libraries Modue that exists or have been imported - > Task :compileJava

所以我在 Intelli J Idea IDE 中的许多基于 JavaFX Gradle 的项目中都遇到了这些问题。这让我不得不手动下载库文件并将它们作为我的项目的一部分作为解决方法。

我的 gradle 项目在我 运行 IDE 中的 > Task :compileJava 时一直失败,例如在这个特殊情况下让我创建了问题是我已经从 maven implementation 'io.socket:socket.io-client:2.0.1' 成功导入了 socket io lib,我已经设法导入它并为它写了一些示例代码并且我添加了

requires engine.io.client;
    requires socket.io.client;

在模块信息文件中。因此,当它到达 运行 时,它无法说明

error: module not found: socket.io.client
    requires socket.io.client;
   error: module not found: engine.io.client
    requires engine.io.client;

我已经在 JDK 13,16,17 上尝试过,看看我是否遗漏了什么,但总是失败 运行,所以我现在注意到我以前的 JavaFX 项目中的趋势我设法逃脱了。

因此,如果有人了解 Gradle 设置有什么问题,请提供帮助。

此答案概述了一种方法,而不是具体的解决方案。

socket.io.clientengine.io.client 不是模块名称。

socket.io-client library is not Java platform modularized (as far as I can tell), so it will be an .

模块的名称将派生自jar 名称。我不知道确切的翻译,因为 jar 名称有 .- 字符,可以重新映射(或不映射)以使模块名称有效。首先尝试确切的 jar 文件名。每个 jar 只能有一个模块。

除了需要正确的名称外,jar 还需要位于模块路径上。 Maven 会为自动模块自动执行此操作,Gradle 不会。我不是 Gradle 专家,因此不会为 Gradle.

提供有关如何执行此操作的建议

如果您在 module-info 中使用正确的名称并确保 jar 在模块路径中,那么它可能会工作,或者它可能与 Java 模块系统不兼容你不容易修复(即损坏的模块必须由模块维护者修复)。

您可以向库维护者提出问题,让他们为模块创建 module-info.java 文件并更新有关如何在 Java 模块环境中使用其库的文档。

如果您尝试使用的库在用作模块时与 Java 模块系统不兼容,那么您可以尝试通过从中删除 module-info.java 来创建您的项目 non-modular您的项目并添加适当的 command-line 开关。要了解如何执行此操作,请参阅 openjfx.io.

上有关 non-modular 项目的文档