Java 9 个模块:自动模块能否产生更大(完整)的项目?

Java 9 Modules: Can automatic Modules result in larger (full) projects?

我猜是自动模块:

http://openjdk.java.net/projects/jigsaw/spec/sotms/#automatic-modules

意味着需要第 3 方 jar 的项目的每个模块都必须将该 jar 打包到它自己的 modular jar 中。如果是这样的话,一个大型的多模块应用程序最终不能比它的 Java 8,基于类路径的对应物更大吗?我想到了所有几乎无处不在的 apache 库和其他常见的开源依赖项。

我得到了未来的胜利;所有这些第 3 方库本身都是模块化的,因此只需要分发最小配置。但是,在短期内,如果没有类路径,那里不会有一些非常笨重的模块化 jar 吗?还是我遗漏了什么?

我认为您误解了自动模块的工作原理。他们的关键 属性 是您可以使用现有的非模块化 JAR,将它们放在模块路径上并让它们作为模块出现以供编译或在 运行 时出现。

I guess automatic modules means that each module of a project that requires a 3rd party jar will have to package that jar inside it's own modular jar.

不,一点也不。恰恰相反,您可以重用现有的 JAR。

您的问题和评论暗示类路径即将消失:事实并非如此。

在解决自动模块之前,还需要了解其他概念。

在 Java9 中,类路径仍然存在,熟悉的遗留 jar(即非模块化 jar)仍然可以工作。但是,还有一个包含模块化 jar 的新模块路径。

模块化 jar 包含一个 module-info.class,它非常明确地说明 (a) 作为依赖项所需的模块和 (b) 导出哪些包。

一个关键点是类路径和模块路径之间的交互:

  • 类路径上的遗留 jar 对模块路径一无所知,因此它们被授予访问所有模块的权限。
  • 因为classpath一般比较乱,所以被称为未命名模块。因为没有名称,modulepath 上的模块化 jar 无法引用其 module-info.java.
  • 中的遗留 jar

有了这么多信息,不可能以零散的方式模块化项目:如果应用程序 jar 需要第三方库,我们将不得不 (a) 等待库作者将其模块化或(b) 尝试自己将其模块化。两者都不是首发。

输入自动模块。它们是驻留在模块路径上的遗留(非模块化)jar。它们充当类路径和模块路径之间的桥梁,因为:

  • 自动模块命名(机制可能是一个单独的问题),并且可以被模块引用。
  • 自动模块被授予对未命名模块(即类路径上的遗留 jar)和模块路径上的所有模块(即 JDK 模块)中所有内容的读取访问权限。

This video and this video提供插图。