距我进行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的使用,我认为该模块会使项目处于某种传统的开发模式,而无需模块化?
有人可以给我关于我做错了什么的指导,并指导我设置包含模块化和非模块化混合库的项目吗?
谢谢。
答案 0 :(得分:1)
如果默认程序包中有module-info.java
文件,则您的代码将封装在模块中。 要在模块内使用JAR功能,
module-info.java
:requires <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的事情。