NetBeans 18 Maven JavaFX 20 项目不会承认 smack

问题描述 投票:0回答:1

我有一个项目,打算使用 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版本,结果相同。不确定这是一个有效的测试,但这就是我尝试过的。

有人知道发生了什么事吗?

linux javafx netbeans xmpp smack
1个回答
0
投票

您需要为 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 入门文档中针对非模块化项目的记录。

© www.soinside.com 2019 - 2024. All rights reserved.