自从我做Java编程以来已经有一段时间了,我很惊讶地回到它,整个景观对我来说是陌生的。
我在混合模块化和非模块化环境中使用 Eclipse(2018-09,4.9.0)标准 Java 项目时遇到问题。具体来说,我正在尝试使用Eclipse平台(没有Gradle或Maven的基础Java项目)将JavaFX 11(模块化)和Apache POI 4.1(非模块化)结合起来。
在我的模块信息中.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
在模块信息中添加以下内容.java使用为 Apache POI 创建的自动模块,如下所示,
requires poi;
在 Eclipse 中生成警告,指示自动模块不稳定,该警告似乎被识别,但继续产生无法解决的错误。
我还尝试将主 POI jar 文件放在类路径中,而不是模块路径,但无济于事。
涉及与UI分离的Apache POI的代码有效。我只需要删除模块信息的使用.java我认为它将项目置于某种没有模块化的传统开发模式?
有人可以给我一个关于我做错了什么的指示,并指导我设置一个混合模块化和非模块化库的项目吗?
提前谢谢。
如果默认包中有module-info.java
文件,则代码将封装在模块中。要在模块中使用一些 JAR 的东西,
- JAR 必须位于模块路径上,并且
- 模块必须在
module-info.java
:requires <module_name>;
中显式声明为必需的。
否则,无法解析导入语句。类路径上的任何项都无法从模块访问;并且模块路径上没有requires ...
的任何内容都不能在模块中使用module-info.java
。因此,在您的情况下,如果没有requires poi;
(并且没有模块路径上的 POI 库),它将无法工作。
"自动模块的名称"..."不稳定">警告只是一个提示,POI JAR没有作为模块构建,而是用作模块。实际上这意味着,如果重命名JAR文件,模块名称也可以更改,并且必须调整module-info.java
文件。从技术上讲,POI JAR既不包含module-info.class
文件,也不包含行Automatic-Module-Name: ...
的META-INF/MANIFEST.MF
文件。因此,模块名称poi
派生自 JAR 的文件名。"自动模块的名称"..."不稳定">警告可以在">模块"部分中的">项目>属性:Java 编译器>错误/警告"中关闭。
总而言之,您没有混合的模块化和非模块化依赖项。相反,旧版 JAR 通过从文件名派生模块名称来自动成为模块。在这种情况下,Eclipse 缺省情况下会警告您,只需更改该 JAR 的文件名即可破坏应用程序。
所以,事实证明。我确实搞砸了。POI库中有5个相互依赖的jar文件,该文件导致错误"无法解析导入">
一旦我在模块信息中包含所有 5 个文件.java项目就编译了。
requires poi.excelant;
requires poi.ooxml;
requires poi.ooxml.schemas;
requires poi.scratchpad;
requires poi;
我确信并非所有这些都是必要的,但我包括了所有这些以防万一。
感谢大家的阅读,并肯定我没有做任何事情来破坏Eclipse。