首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块和JAR文件之间有什么区别?

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

Stack Overflow用户
提问于 2017-10-01 15:29:55
回答 3查看 10.8K关注 0票数 33

我正在从Java9的新特点是什么?学习Java9,讨论的热点之一是模块化JDK。

是JAR文件模块吗?

模块与JAR文件有何不同?

EN

回答 3

Stack Overflow用户

发布于 2017-10-01 15:49:09

模块:Java9中引入的一种新的语言特性(类似于类、接口、包等)它由包集合组成,类似于包是如何由类型集合组成的。

JAR:打包代码和资源的归档文件格式,可以由JVM加载。

更具体地说,模块是定义如下

为了提供可靠的配置和强大的封装方式,既可供开发人员使用,又可由现有的工具链支持,因此,我们将模块视为一种基本的新型Java程序组件。A 模块是一个命名的、自描述的代码和数据集合.它的代码被组织成一组包含类型的包,即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. 可以更改一个罐子的名称。只要JVM类加载器在类路径(可以由单个JAR、多个JAR或目录或JAR之间的混合组成)上找到所需的类,JAR文件的名称就可以是任意的。但是,可以在其他模块的声明中显式引用模块的名称,这样的名称定义了模块,不能随意更改。
票数 25
EN

Stack Overflow用户

发布于 2017-10-01 16:57:04

严格地说,模块是一个运行时概念.正如其他人从模块系统的状态引用的那样

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

这和JARs非常相似,但是.

  1. JAR在运行时没有有意义的表示。
  2. JAR不是“自我描述”,在本例中,这意味着它们没有JVM关心的名称,无法表示依赖关系或定义正确的API。

这就引出了一个问题,模块从何而来?有很多种方式,但对于开发人员来说,最突出的是模块化JAR。模块JAR就像普通的JAR,但是它包含一个模块描述符,这是一个从module-info.java编译的文件module-info.class。正是那个文件,定义模块的名称、依赖项和API

因此,JAR和模块之间有很强的联系:JAR是模块系统创建模块的容器,(目前)每个JAR只能包含一个模块。需要注意的是,即使在Java 9上,JAR也不必是模块化的--普通的JAR是完全可以的。

票数 14
EN

Stack Overflow用户

发布于 2017-10-01 15:53:55

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

不,Java档案馆不是模块

仅举一个例子,虽然的类是相同的包,但现在是https://stackoverflow.com/questions/42358084/package-conflicts-with-automatic-modules-in-java-9

JAR是一种文件格式,使您能够将多个文件捆绑到单个存档文件中。通常,这包含与applet和应用程序相关联的类文件和辅助资源。

另一方面(我也尝试在这里描述~> java-模块 )

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

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

每个模块定义是

  • 一种模块工件,即模块JAR文件或包含已编译模块定义的JMOD文件,或者其他
  • 一个已爆炸的模块目录,按照惯例,它的名称是模块的名称,其内容是对应于包层次结构的“爆炸”目录树。

如模块系统所介绍的,模块映像由模块而不是JAR文件组成。模块化是根据模块化的战争文件也是。的动态配置来预见的。

但是为了便于模块的采用,在JDK9中引入了一个模块JAR文件,,这样就可以说一个由module-info.java组成的模块,例如

代码语言:javascript
复制
module com.foo.bar { }

和其他java类

代码语言:javascript
复制
com/foo/bar/alpha/AlphaFactory.java
com/foo/bar/alpha/Alpha.java

现有的工具已经可以创建、操作和使用JAR文件。模块JAR文件在所有可能的方面都类似于普通JAR文件,但它还在根目录中包含了一个模块info.class文件。例如,用于上述com.foo.bar module的模块化JAR文件可能包含以下内容: META-INF/ META-INF/MANIFEST.MF模块-INF.com com/foo/bar/alpha/AlphaFactory.class com/foo/bar/alpha/Alpha.class 模块JAR文件可以用作模块,在这种情况下,它的模块info.class文件被视为包含模块的声明。或者,它可以放置在普通的类路径上,在这种情况下,它的模块info.class文件将被忽略。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46513903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档