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

时间:2017-10-25 18:34:12

标签: java eclipse maven java-9 module-path

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

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

正如您所期望的那样,我已经宣布了一个非常开放的模块:

module com.example.user {   
    exports com.example.user;
}

这会立即打破整个项目(在所有类中),突然每个外部依赖项的导入都不再解析(导致超过1k的Java问题):

  

导入com.atherexample无法解析

     

无法解析导入org.springframework

     

同一项目com.example.price中的本地软件包仍可正常工作 - java.util等。

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

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

我读过关于使用automatic modules的内容,这似乎意味着你可以通过将它们包含在你的模块路径中来使用传统/非模块化jar,然后通过文件名引用它们。他们使用的例子是:

module com.foo.myapp {
  requires guava;  // guava not yet modularised, so use the filename
}

我无法找到更多其他信息,但这似乎与Eclipse在自动生成module-info.java时使用的惯例相符:

spring-core-4.3.8.RELEASE.jar

变为:

requires spring.core;

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

  

spring.core无法解析为模块

Maven报道:

[ERROR] module-info.java:[39,16] error: module not found: spring.core

...项目中具有外部依赖关系的每个类仍然被破坏。

1 个答案:

答案 0 :(得分:7)

感谢Robert Scholte指出更新的maven-compiler-plugin 3.7.0(我一直在使用3.6.1),这确实清理了编译目标命令行输出(使用Java 9细节) ,帮助我解决问题的路线。这缩小了每个requires报告的错误,将错误归结为:

[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:

foo.bar cannot be resolved to a module

仅出现六个自动模块/库(jar)的错误 - 而不是全部(24个)错误。大。

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

为什么呢?基本Maven依赖关系管理 - 我将这些库限定在默认目标之外(以匹配输出目录拆分)。

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