首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法解决Java 9的自动模块依赖关系/找不到模块

无法解决Java 9的自动模块依赖关系/找不到模块
EN

Stack Overflow用户
提问于 2017-10-25 18:34:11
回答 1查看 4.3K关注 0票数 7

我正在尝试将一些遗留应用程序迁移到新的Java 9模块系统中,以加强其封装。

我从外部开始,假设外围的类具有最少的外部依赖。

正如您所期望的,我已经声明了一个非常开放的模块:

代码语言:javascript
运行
复制
module com.example.user {   
    exports com.example.user;
}

这会立即破坏整个项目(在所有类中),当外部依赖项的每个导入突然不再解决时(导致1k以上的Java问题):

无法解析导入com.otherexample 无法解析导入org.springframework 等。

在同一个项目中的本地包com.example.price仍然工作-和java.util一样。

所有外部依赖项都是用Maven管理的。在(Eclipse项目)构建路径中,我仍然可以看到它们是"Classpath“依赖项--但只有"Modulepath”中的JRE系统库。

这两个概念能共存吗?目前看来,通过在项目中的任何地方都有一个module-info.java,所有类路径依赖项都停止工作了?

我确实读过关于使用自动模块的文章,这似乎意味着您可以使用遗留/非模块化的jars,方法是将它们包含在模块路径中,然后通过文件名来引用它们。他们用的例子是:

代码语言:javascript
运行
复制
module com.foo.myapp {
  requires guava;  // guava not yet modularised, so use the filename
}

我找不到更多的其他信息,但这似乎与Eclipse在自动生成模块info.java时使用的惯例相匹配,例如:

代码语言:javascript
运行
复制
spring-core-4.3.8.RELEASE.jar

变成:

代码语言:javascript
运行
复制
requires spring.core;

但是,这仍然会导致Eclipse报告的Java错误:

无法将spring.core解析为模块

Maven报告:

代码语言:javascript
运行
复制
[ERROR] module-info.java:[39,16] error: module not found: spring.core

...and项目中具有外部依赖关系的每个类仍处于中断状态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-26 11:27:11

由于罗伯特·肖尔特指出了更新的maven编译器-plugin3.7.0(我使用了3.6.1),这就真正地清理了编译目标命令行输出(包含Java9的具体内容),以帮助我找到问题的路径。这缩小了来自每个requires的报告错误,给出了以下错误:

代码语言:javascript
运行
复制
[WARNING] ********************************************************************************************************************
[WARNING] * Required filename-based automodules detected. Please don't publish this project to a public artifact repository! *
[WARNING] ********************************************************************************************************************
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 56 source files to ./target/classes
~~~ snip ~~~
[ERROR] module-info.java error: module not found: foo.bar

匹配Eclipse:

代码语言:javascript
运行
复制
foo.bar cannot be resolved to a module

错误只出现在六个自动模块/库(jar)中,而不是全部(24个)。太棒了。

在我的POM中,我将源目录的输出拆分为它们自己的输出目录(target/classes)。但是,由于module-info.java引用的依赖项(如requires spring.core;)没有被该文件夹中的代码(类)使用/引用--它无法解决它们。

为什么?基本Maven依赖关系管理--我在默认目标之外限定了那些库的范围(以匹配分离的输出目录)。

这是一个相当基本的结果--但我想我不会是唯一遇到这种情况的人,因为Java开始侵入与传统Maven使用重叠的依赖管理的某些方面。

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

https://stackoverflow.com/questions/46939741

复制
相关文章

相似问题

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