我正在尝试将一些遗留应用程序迁移到新的 Java 9 模块系统,以加强其封装。
我从外向内开始,假设外围的类具有最少的外部依赖性。
正如你所料,我已经声明了一个非常开放的模块:
module com.example.user {
exports com.example.user;
}
这会立即破坏整个项目(在所有类中),突然每个外部依赖项的导入都不再解决(导致超过 1k Java 问题):
导入 com.otherexample 无法解析
导入org.springframework无法解析
等等
同一个项目中的本地包com.example.price
仍然有效 - 就像java.util
等一样。
所有外部依赖项都由 Maven 管理。在(Eclipse 项目)构建路径中,我仍然可以将它们视为“类路径”依赖项——但只有“模块路径”中的 JRE 系统库。
这两个概念可以共存吗?目前似乎module-info.java
在项目中的任何地方都有一个,所有类路径依赖项都停止工作?
我确实读过有关使用自动模块的信息,这似乎暗示您可以通过将它们包含在您的模块路径中来使用旧版/非模块化 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 无法解析为模块
马文报告:
[ERROR] module-info.java:[39,16] error: module not found: spring.core
...并且项目中具有外部依赖关系的每个类仍然被破坏。