为什么Java 9不会简单地将类路径上的所有JAR转换为自动模块?

为了理解我们的类别:

  • 平台显式模块
  • 应用显式模块
  • 打开模块
  • 自动模块
  • 未命名的模块

类路径中的所有类和jar都将是未命名模块的一部分。 但为什么我们需要呢? 自动模块的优势在哪里? 我可以“要求”那些该死的传统jar子,使它们成为一个自动模块。 我没有把它包括在内吗?

至少有两个原因:

  • 正如常规模块一样,自动模块会被模块系统怀疑某些检查,例如不拆分包 。 由于类路径上的JAR可以(并且偶尔会)拆分包,因此强制检查它们将是向后兼容的并且会破坏许多应用程序。
  • 未命名的模块可以读取所有平台模块,而自动模块只能读取那些进入模块图的模块。 这意味着需要java.desktop模块(例如)的JAR将从类路径开始工作,但不能从模块图中工作,除非java.desktop也将其放入图形中(通过依赖项或--add-modules )。

我现在没时间检查第二个,但这就是模块系统状态所说的:

因此,在解析模块图之后,使自动模块读取每个其他命名模块,无论是自动还是显式

解决方案适用于声明的依赖项,自动模块声明无。