所以我在Intelli J Idea IDE的许多基于JavaFX Gradle的项目中一直面临这些问题。这迫使我不得不手动下载库文件,并将它们作为我项目的一部分作为解决方案。
当我在IDE中运行> Task :compileJava
时,我的gradle项目一直失败,例如,在这个特殊的使我创建的问题是,我已经成功地从mavenimplementation 'io.socket:socket.io-client:2.0.1'
导入了socket io库,我已经成功地导入了它,并为它编写了一些示例代码,我添加了
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.client
和engine.io.client
不是模块名。
socket.io-client
库不是Java平台模块化的(据我所知),所以它将是一个自动模块。
模块的名称将从jar名称派生。我不知道确切的翻译,因为jar名称有.
和-
字符,可以重新映射(或不)使模块名称有效。首先尝试准确的jar文件名。每个jar只能有一个模块。
除了需要正确的名称外,jar还需要位于模块路径上。Maven会自动为自动模块做这些,而Gradle不会。我不是Gradle专家,所以不会提供关于如何为Gradle做这些的建议。
如果你在module-info中使用了正确的名称,并确保jar位于模块路径上,那么它可能会工作,或者它可能与Java模块系统不兼容,而这些不容易被你修复(即损坏的模块必须由模块维护者修复)。
你可以向库维护者提出一个问题,让他们为模块创建module-info.java
文件,并更新关于如何在Java模块环境中使用库的文档。
如果您尝试使用的库在作为模块使用时与Java模块系统不兼容,那么您可以尝试通过从项目中删除module-info.java
并添加适当的命令行开关来使项目非模块化。要了解如何做到这一点,请参阅openjfix .io上关于非模块化项目的文档。