首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Java11在Eclipse中进行模块化和非模块化混合开发

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

Stack Overflow用户
提问于 2019-04-12 01:34:39
回答 2查看 2.6K关注 0票数 3

自从我从事Java编程以来,已经有一段时间了,我很惊讶地又回到了它,因为在项目jig-saw之后,整个场景对我来说都是陌生的。

我在混合模块化和非模块化环境下使用Eclipse (2018-09,4.9.0)标准Java项目时遇到了问题。具体地说,我正在尝试使用Eclipse平台(不带JavaFX或Maven的base Java项目)将Java11(模块化的)和Apache POI4.1(非模块化的)结合起来。

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

代码语言:javascript
复制
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中都会出现以下错误

代码语言:javascript
复制
The import cannot be resolved

使用为Apache POI创建的automatic模块在module-info.java中添加以下内容,如下所示:

代码语言:javascript
复制
        requires poi;

在Eclipse中生成一个警告,指示automatic模块不稳定,这似乎可以识别,但仍会继续产生cannot be resolved错误。

我还尝试将主POI jar文件放在类路径中,而不是模块路径中,但没有效果。

与UI分离的涉及Apache POI的代码可以正常工作。我只需要删除module-info.java的使用,我认为它会使项目处于某种遗留的开发模式,sans模块化?

有没有人可以给我指出我做错了什么,并指导我用模块化和非模块化的混合库来设置一个项目?

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2019-04-12 02:20:05

如果默认包中有module-info.java文件,则代码将封装在模块中。在模块中使用类似JAR的

  • JAR必须位于模块路径和
  • 上该模块必须在<>E212JAR中显式声明为required 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的文件名,就可以破坏应用程序。

票数 5
EN

Stack Overflow用户

发布于 2019-04-12 05:22:34

所以,事实证明。我做错了。POI库中有5个相互依赖的jar文件,它导致了错误“导入无法解决”

一旦我在module-info.java中包含了所有5个文件,项目就会编译。

代码语言:javascript
复制
        requires poi.excelant;
        requires poi.ooxml;
        requires poi.ooxml.schemas;
        requires poi.scratchpad;
        requires poi;

我确信并不是所有这些都是必要的,但我将它们全部包含在内,以防万一。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55638253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档