模块和JAR文件有什么区别?

时间:2017-10-01 15:29:56

标签: java jar java-9 java-module

我正在从What's New in Java9学习Java 9,讨论中的一个热门话题是模块化JDK

JAR是文件模块吗?

模块与JAR文件有何不同?

3 个答案:

答案 0 :(得分:15)

模块:Java 9中引入的新语言功能(类似于类,接口,包等),由一组包组成,类似于包由一组类型组成。

JAR :一种存档文件格式,它捆绑代码和资源,可以由JVM加载。

更具体地说,模块是defined as follows

  

为了以一种既可供开发人员使用又可由现有工具链支持的方式提供可靠的配置和强大的封装,我们将模块视为一种基本的新型Java程序组件。 模块是一个命名的,自描述的代码和数据集合。它的代码被组织为一组包含类型的包,即Java类和接口;其数据包括资源和其他类型的静态信息。

     

...

     

模块的自我描述在其模块声明中表示,模块声明是Java编程语言的新结构。

     

...

     

按照惯例,模块声明被编译到名为module-info.class的文件中,类似地放在类文件输出目录中。

可以将模块编译成Jar文件,在这种情况下,Jar文件标记为模块化Jar文件

  

现有工具已经可以创建,操作和使用JAR文件,因此为了便于采用和迁移,我们定义了模块化JAR文件。模块化JAR文件在所有可能的方式都像普通的JAR文件,除了它的根目录中还包含一个module-info.class文件。

模块和JAR之间的一些其他差异:

  1. 模块可以需要其他模块,以便允许需求模块访问依赖类。 Jar没有这样的依赖概念。

  2. 模块可以决定将哪些类和接口导出到需要它的其他模块。 Jar没有这样的封装机制。

  3. 模块可以编译成模块化的Jar文件,但是一些模块(例如JDK模块)被编译成另一种称为JMOD的格式。

  4. 可以更改JAR的名称。只要JVM类加载器在类路径上找到所需的类(可以由单个JAR,多个JAR或目录或JAR之间的混合组成),JAR文件的名称就可以是任何名称。但是,模块的名称可以在其他模块的声明中显式引用,并且这样的名称定义它并且不能自由更改。

答案 1 :(得分:8)

严格来说,模块是一个运行时概念。正如其他人引用The State of the Module system

  

模块是一个命名的,自描述的代码和数据集合。它的代码被组织为一组包含类型的包,即Java类和接口;其数据包括资源和其他类型的静态信息。

这与 JARs 非常相似,但是......

  1. JAR在运行时没有有意义的表示
  2. JAR不是"自我描述",在这种情况下意味着他们没有JVM关心的名称,无法表达依赖关系或定义适当的API
  3. 这就留下了一个问题,模块来自哪里?有多种方式,但开发人员最突出的方法是模块化JAR。 模块化JAR 就像普通的JAR一样,但它包含一个模块描述符,一个从module-info.class编译的文件module-info.java。该文件是defines a module's name, dependencies, and APIs

    因此JAR和模块之间存在强大的联系:JAR是模块系统从中创建模块的容器,并且(目前)每个JAR只能包含一个模块。值得注意的是,即使在Java 9 JAR上, 也不是模块化的 - 普通的JAR完全没问题。

答案 2 :(得分:7)

JAR文件是模块吗?模块与JAR文件有何不同?

不,Java Archive不是 模块

仅举例来说, the same package could have been spread across JARs的类,现在是同一个包[{3}}

  

JAR 是一种文件格式,可以捆绑多个文件   到一个档案文件。通常,这包含类文件   与applet和应用程序相关的辅助资源。

另一方面(我试图在这里描述这个〜> can not be read from multiple modules.

  

模块是一个命名的,自描述的代码和数据集合。它的   代码被组织为包含类型的包,即Java   类和接口;其数据包括资源和其他类型   静态信息。

这也包括在module-info.java的帮助下指定的模块声明。

每个模块定义都是

  • 模块工件,即 包含已编译模块定义的模块化JAR文件或JMOD文件 ,否则< / p>

  • 爆炸模块目录,按照惯例,其名称是模块的名称,其内容为&#34;爆炸&#34;目录树对应于包层次结构。

正如模块系统所介绍的,模块化图像由模块而不是JAR文件组成。 使用

的动态配置可预见模块化

但是为了便于采用模块,在JDK9中引入了Modular WAR file as well.,这样就可以说包含module-info.java的模块

module com.foo.bar { }

和其他java类

com/foo/bar/alpha/AlphaFactory.java
com/foo/bar/alpha/Alpha.java
  

现有工具已经可以创建,操作和使用JAR文件。 模块化JAR 文件就像普通的JAR文件一样   可能的方法,除了它还包括module-info.class文件   在其根目录中。上述com.foo.bar module的模块化JAR文件可能包含以下内容:

META-INF/
META-INF/MANIFEST.MF
module-info.class
com/foo/bar/alpha/AlphaFactory.class
com/foo/bar/alpha/Alpha.class
...
     

模块化JAR文件可以用作模块,在这种情况下,其module-info.class文件用于包含模块的声明。   或者,它可以放在普通的类路径上,其中   case的module-info.class文件被忽略。