Java 9模块:自动模块可以产生更大(完整)的项目吗?

时间:2017-06-18 07:11:38

标签: classpath java-9 java-module

我猜自动模块:

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

意味着需要第三方jar的项目的每个模块都必须将该jar包装在其自己的模块化jar 中。如果是这种情况,那么大型多模块应用程序最终会比基于类路径的Java 8更大吗?我正在考虑所有几乎无处不在的apache库和其他常见的开源依赖项。

我将来获胜;所有这些第三方库本身都是模块化的,因此只需要分发最小配置。但是,在短期内,没有类路径,那里会不会有一些非常笨重的模块化罐子?或者我错过了什么?

2 个答案:

答案 0 :(得分:4)

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

  

我猜自动模块意味着需要第三方jar的项目的每个模块都必须将该jar包装在其自己的模块化jar中。

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

答案 1 :(得分:1)

你的问题和评论意味着类路径消失了:它不是。

在解决自动模块之前,还有其他要理解的概念。

在Java 9中,类路径仍然存在,熟悉的传统jar(即非模块化jar)仍然有效。但是,还有一个包含模块化jar的新模块路径。

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

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

  • 类路径上的传统jar对模块路径一无所知,因此可以访问所有模块。
  • 因为类路径通常是混乱的,所以它被称为未命名模块。由于没有名称,模块路径上的模块化jar文件无法引用module-info.java中的旧版jar。

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

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

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

This videothis video提供插图。