我有一个项目,打算使用 XMPP 进行 IM。我已经调用了 NetBeans,smack 依赖项,它在 pom.xml 文件中显示为:
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java8</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-tcp</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-im</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-extensions</artifactId>
<version>4.4.0</version>
</dependency>
但是,当我尝试将 smack 添加到 moduleinfo 或我的代码尝试导入 org.igniterealtime.smack 时,会出现错误...找不到模块。带有依赖项的清理和构建确实下载了它,它位于我的 .m2/org.igniterealtime/smack 文件夹中。
我真的不确定是什么让 Netbeans 无法看到本地存储库中的内容。
我也尝试过使用jivesoftware版本,结果相同。不确定这是一个有效的测试,但这就是我尝试过的。
有人知道发生了什么事吗?
您需要为 smack 依赖项提供正确的模块名称。
当我尝试将 smack 添加到 moduleinfo 或我的代码尝试导入 org.igniterealtime.smack 时,出现错误...找不到模块
这(可能)意味着您在模块信息中为 smack 指定了错误的模块名称。您没有在问题中提供模块信息,所以我不知道您设置的错误值是什么。
smack 依赖项没有模块信息。如果您下载 jar 文件并提取内容,您可以看到这一点。它在清单中也没有
Automatic-Module-Name
设置。因此,自动模块名称将从 jar 文件中派生。该名称是根据static ModuleFinder of(Path... entries)
文档中的这些(复杂)规则得出的,其要点简单概括为:
因此 smack 依赖项的可能模块名称是:
smack.java8
您可以使用
module-info.java
中的这一行将其作为模块添加到您的项目中:
requires smack.java8;
您可能需要对其他 smack 依赖项(也许还有您的项目正在使用的其他 3rd 方库)执行相同的操作,例如:
requires smack.java8;
requires smack.tcp;
requires smack.im;
requires smack.extensions;
您还需要确保所需的依赖项位于 Java 模块路径(而不是类路径)上。如果您使用最新的 Maven 版本,Maven 可以识别模块化项目,并将依赖项放置在模块路径上(甚至是自动路径)。当你将Maven项目导入netbeans时,我不知道netbeans是否会配置netbeans项目以将所需的依赖项放置在模块路径上(我知道Idea会自动为模块化项目执行此操作)。
要了解有关自动模块的更多信息,请参阅:
在撰写此答案时,我并没有尝试真正在模块化项目中工作。
并非所有非模块化软件都可以在模块环境中运行,因此即使您按照上述方式设置系统,仍然可能会出现故障。在这种情况下,最好通过从项目中删除 module-info.java 并通过 VM 参数指定 JavaFX 模块依赖项来使项目成为非模块化项目,如 openjfx.io 入门文档中针对非模块化项目的记录。