我正在尝试将一些遗留应用程序迁移到新的Java 9模块系统中,以加强其封装。
我从外部开始,假设外围的类具有最少的外部依赖。
正如您所期望的,我已经声明了一个非常开放的模块:
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,方法是将它们包含在模块路径中,然后通过文件名来引用它们。他们用的例子是:
module com.foo.myapp {
requires guava; // guava not yet modularised, so use the filename
}
我找不到更多的其他信息,但这似乎与Eclipse在自动生成模块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
...and项目中具有外部依赖关系的每个类仍处于中断状态。
发布于 2017-10-26 11:27:11
由于罗伯特·肖尔特指出了更新的maven编译器-plugin3.7.0(我使用了3.6.1),这就真正地清理了编译目标命令行输出(包含Java9的具体内容),以帮助我找到问题的路径。这缩小了来自每个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使用重叠的依赖管理的某些方面。
https://stackoverflow.com/questions/46939741
复制相似问题