eclipse - 使用 Java 11 在 Eclipse 中混合模块化和非模块化开发

标签 eclipse apache-poi java-11 modular javafx-11

自从我做 Java 编程以来已经有一段时间了,我很惊讶地回到它,整个景观对我来说都是陌生的项目拼图。

我在使用具有混合模块化和非模块化环境的 Eclipse (2018-09, 4.9.0) 标准 Java 项目时遇到问题。具体来说,我正在尝试使用 Eclipse 平台(没有 Gradle 或 Maven 的基本 Java 项目)结合 JavaFX 11(模块化)和 Apache POI 4.1(非模块化)。

在我的 module-info.java 我有以下内容,

module myapp {
        requires javafx.base;
        requires javafx.graphics;
        requires javafx.fxml;
        requires javafx.controls;
        requires javafx.web;

        exports myapp.gui;

        opens myapp.gui to javafx.fxml;
}

我发现无论我有 Apache POI 代码,我都会在 Eclipse 中收到以下错误
The import cannot be resolved

使用为 Apache POI 创建的自动模块在 module-info.java 中添加以下内容,如下所示,
        requires poi;

在 Eclipse 中产生一个警告,表明自动模块不稳定,这似乎被识别但继续产生无法解决的错误。

我也尝试将主 POI jar 文件放在类路径中,而不是模块路径,但无济于事。

涉及与 UI 分离的 Apache POI 的代码有效。我只需要删除 module-info.java 的使用,我认为它会将项目置于某种遗留开发模式中,没有模块化?

有人可以告诉我我做错了什么并指导我设置一个混合模块化和非模块化库的项目吗?

提前致谢。

最佳答案

如果您有 module-info.java,则您的代码被封装在一个模块中。默认包中的文件。 在模块中使用 JAR 的东西 ,

  • JAR 必须位于模块路径
  • 该模块必须根据需要显式声明module-info.java : requires <module_name>; .

  • 否则,导入语句无法解析。 Classpath 上的任何项目都无法从模块访问;如果没有 requires ...,Modulepath 上什么都没有在 module-info.java可以在模块中使用。因此,在您的情况下,如果没有 requires poi;,它将无法工作 (并且在 Modulepath 上没有 POI 库)。

    “自动模块 '...' 的名称不稳定”警告只是一个提示 , POI JAR 没有作为模块构建,而是作为模块使用。实际上这意味着如果您重命名 JAR 文件,模块名称也可以更改,您必须调整 module-info.java文件。从技术上讲,POI JAR 不包含 module-info.class文件或 META-INF/MANIFEST.MF文件的行 Automatic-Module-Name: ... .所以模块名称poi源自 JAR 的文件名。可以在“模块”部分的“项目”>“属性:Java 编译器”>“错误/警告”中关闭“自动模块的名称 '...' 不稳定”警告。

    总而言之,您没有混合的模块化和非模块化依赖项。相反,遗留 JAR 通过从文件名派生模块名自动成为模块。在这种情况下,Eclipse 默认会警告您,只需更改该 JAR 的文件名即可破坏该应用程序。

    关于eclipse - 使用 Java 11 在 Eclipse 中混合模块化和非模块化开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55638253/

    相关文章:

    java - Apache POI docx - 如何设置页面大小?

    java.exe 以非零退出值 1 结束

    java - 通过标准 JDK 11 使用 graalvm

    java - 模块描述 rune 件允许导入语句为什么?

    c - 当我尝试将函数的参数设置为默认时发生意外错误

    java - 通过 JDT API 以编程方式访问 Java 项目的 build.properties

    php - 将现有的 zend 框架目录添加到 eclipse

    android - 如何从 Eclipse 中删除 'unremovable' 控制台

    java - 如何在apache poi中将某种字体设置为fontFamily样式?

    java.security.NoSuchAlgorithmException : PKCS11 KeyStore not available, 尝试在 java 11 中使用 SUNPKCS11 启用 FIPS 模式