自从我从事Java编程以来,已经有一段时间了,我很惊讶地又回到了它,因为在项目jig-saw之后,整个场景对我来说都是陌生的。
我在混合模块化和非模块化环境下使用Eclipse (2018-09,4.9.0)标准Java项目时遇到了问题。具体地说,我正在尝试使用Eclipse平台(不带JavaFX或Maven的base Java项目)将Java11(模块化的)和Apache POI4.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创建的automatic模块在module-info.java中添加以下内容,如下所示:
requires poi;在Eclipse中生成一个警告,指示automatic模块不稳定,这似乎可以识别,但仍会继续产生cannot be resolved错误。
我还尝试将主POI jar文件放在类路径中,而不是模块路径中,但没有效果。
与UI分离的涉及Apache POI的代码可以正常工作。我只需要删除module-info.java的使用,我认为它会使项目处于某种遗留的开发模式,sans模块化?
有没有人可以给我指出我做错了什么,并指导我用模块化和非模块化的混合库来设置一个项目?
提前谢谢。
发布于 2019-04-12 02:20:05
如果默认包中有module-info.java文件,则代码将封装在模块中。在模块中使用类似JAR的,
否则,导入语句将无法解析。类路径上的任何项都不能从模块中访问;模块路径中没有module-info.java中的requires ...的任何项都不能在模块中使用。因此,在您的例子中,如果没有 requires poi; (并且没有Modulepath上的POI库),就不会工作。
"Name of automatic module '...‘is used“警告只是一个提示,说明POI JAR尚未构建为模块,而是用作模块。实际上,这意味着如果您重命名JAR文件,模块名称也可以更改,并且您必须调整module-info.java文件。从技术上讲,POI JAR既不包含module-info.class文件,也不包含带有Automatic-Module-Name: ...行的META-INF/MANIFEST.MF文件。因此,模块名poi是从JAR的文件名派生而来的。可以在模块部分的Project > Properties: Java Compiler >Errors/ warning中关闭"Name of automatic module '...‘is unstable“警告。
总而言之,您没有混合的模块化和非模块化依赖项。相反,通过从文件名派生模块名,遗留JAR会自动成为模块。在这种情况下,Eclipse默认情况下会警告您,只需更改该JAR的文件名,就可以破坏应用程序。
发布于 2019-04-12 05:22:34
所以,事实证明。我做错了。POI库中有5个相互依赖的jar文件,它导致了错误“导入无法解决”
一旦我在module-info.java中包含了所有5个文件,项目就会编译。
requires poi.excelant;
requires poi.ooxml;
requires poi.ooxml.schemas;
requires poi.scratchpad;
requires poi;我确信并不是所有这些都是必要的,但我将它们全部包含在内,以防万一。
感谢大家阅读并确认我没有做任何破坏Eclipse的事情。
https://stackoverflow.com/questions/55638253
复制相似问题