我正在尝试将一些遗留应用程序迁移到新的Java 9模块系统,以加强其封装.
我从外向内开始,假设外围的类具有最少的外部依赖性.
正如您所期望的那样,我已经宣布了一个非常开放的模块:
module com.example.user {
exports com.example.user;
}
Run Code Online (Sandbox Code Playgroud)
这会立即打破整个项目(在所有类中),突然每个外部依赖项的导入都不再解析(导致超过1k的Java问题):
导入com.atherexample无法解析
无法解析导入org.springframework
等等
同一项目中的本地软件包com.example.price仍可正常工作 - java.util等等.
使用Maven管理所有外部依赖项.在(Eclipse项目)构建路径中,我仍然可以将它们视为"Classpath"依赖项 - 但只能看到"Modulepath"中的JRE系统库.
这两个概念可以共存吗?目前,似乎module-info.java在项目中的任何位置,所有类路径依赖都停止工作?
我读过关于使用自动模块的内容,这似乎意味着您可以通过将它们包含在模块路径中来使用传统/非模块化jar,然后通过文件名引用它们.他们使用的例子:
module com.foo.myapp {
requires guava; // guava not yet modularised, so use the filename
}
Run Code Online (Sandbox Code Playgroud)
我找不到其他信息,但这似乎与Eclipse在自动生成module-info.java时使用的约定相符:
spring-core-4.3.8.RELEASE.jar
Run Code Online (Sandbox Code Playgroud)
变为:
requires spring.core;
Run Code Online (Sandbox Code Playgroud)
但是,这仍然导致Eclipse报告的Java错误:
spring.core无法解析为模块
Maven报道:
[ERROR] module-info.java:[39,16] error: module not found: spring.core
Run Code Online (Sandbox Code Playgroud)
...并且项目中具有外部依赖性的每个类仍然被破坏.