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

时间:2019-04-11 17:34:39

标签: 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文件放在类路径中,与模块路径相对,但无济于事。

涉及与用户界面分离的Apache POI的代码。我只需要删除对module-info.java的使用,我认为该模块会使项目处于某种传统的开发模式,而无需模块化?

有人可以给我关于我做错了什么的指导,并指导我设置包含模块化和非模块化混合库的项目吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

如果默认程序包中有module-info.java文件,则您的代码将封装在模块中。 要在模块内使用JAR功能

  • JAR必须位于 Modulepath
  • 必须在module-info.javarequires <module_name>; 中明确声明模块为必需的

否则,无法解析导入语句。 Classpath 上的所有项目都无法从模块访问;而在requires ...中没有module-info.java Modulepath 上的任何内容都不能在模块中使用。因此,根据您的情况,如果没有requires poi; (并且没有 Modulepath 上的POI库),它将无法正常工作。

“自动模块'...'的名称不稳定” 警告只是一个提示,因为POI JAR尚未构建为模块,但已使用作为一个模块。实际上,这意味着如果重命名JAR文件,则模块名称也可以更改,并且必须改编module-info.java文件。从技术上讲,POI JAR既不包含module-info.class文件,也不包含带有META-INF/MANIFEST.MF行的Automatic-Module-Name: ...文件。因此,模块名称poi是从JAR的文件名派生的。可以在 Module中的 Project> Properties:Java Compiler> Errors / Warnings 中关闭“自动模块'...'的名称不稳定” 警告。 部分。

总结起来,您没有混合的模块化和非模块化依赖性。相反,通过从文件名中导出模块名称,旧版JAR会自动成为模块。在这种情况下,Eclipse默认会警告您,只需更改该JAR的文件名即可破坏应用程序。

答案 1 :(得分:0)

因此,事实证明。我确实很傻。 POI库中有5个相互依赖的jar文件,该文件导致错误“无法解析导入”

一旦我将所有5个文件都包含在项目编译的module-info.java中。

        requires poi.excelant;
        requires poi.ooxml;
        requires poi.ooxml.schemas;
        requires poi.scratchpad;
        requires poi;

我确定不是所有的东西都是必要的,但是为了防万一,我将它们全部包括在内。

感谢所有人阅读并确认我没有做任何破坏Eclipse的事情。