当前位置: 首页 > 知识库问答 >
问题:

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

孙泳
2023-03-14

我正在从Java9的新特性中学习Java9,讨论中的一个热门话题是模块化JDK。

JAR文件是模块吗?

模块与JAR文件有何不同?

共有3个答案

端木朝
2023-03-14

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

不,Java 归档不是模块。

举个例子,虽然同一包的类可以分布在 JAR 中,但现在无法从多个模块读取同一个包。

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

另一方面(我试着在这里描述这个~

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

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

每个模块定义都是

>

  • 模块工件,即模块化JAR文件或包含已编译模块定义的JMOD文件,或者

    一个分解的模块目录,其名称按照约定是模块的名称,其内容是对应于包层次结构的“分解”目录树。

    正如模块系统所介绍的那样,模块化映像由模块而不是JAR文件组成。模块化 WAR 文件中的动态配置也预见到模块化。

    但为了便于采用模块,JDK9中引入了一个模块化JAR文件,比如由<code>模块信息组成的模块。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 模块的模块化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 文件将用于包含模块的声明。或者,它可以放在普通类路径上,在这种情况下,它的模块信息.class文件将被忽略。

  • 淳于宏伯
    2023-03-14

    严格来说,模块是一个运行时概念。正如其他人引用的模块状态系统:

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

    这与JAR非常相似,但。。。

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

    这就留下了一个问题,模块从哪里来?有多种方法,但对开发人员来说最突出的是模块化JAR。模块化JAR就像普通JAR一样,但它包含一个模块描述符,一个<code>模块信息文件。从module-info.java编译的类。该文件定义了模块的名称、依赖关系和API。

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

    申嘉慕
    2023-03-14

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

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

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

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

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

    按照惯例,模块声明被编译为名为<code>模块信息的文件。类,类似地放置在类文件输出目录中。

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

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

    模块和JAR之间的其他一些区别:

    >

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

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

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

    罐子的名字可以改变。只要JVM类加载器在类路径(可以由单个JAR、多个JAR或目录或JAR的组合组成)中找到所需的类,JAR文件的名称可以是任何名称。但是,模块的名称可以在其他模块的声明中显式引用,这样的名称定义了它,不能随意更改。

  •  类似资料:
    • 问题内容: 我在只有包的地方使用Java。我知道还有其他编程语言也包含模块。 有什么不同? 问题答案: 很难比较空白中的语义。(您还说什么其他语言?)“模块”可能类似于Java类,Java包或完全其他的东西,具体取决于该其他语言。通常,由于“模块”通常来自过程语言,因此我倾向于讲Java类,但是我认为那一线 很 模糊,您可以令人信服地争论一下程序包。

    • 我有Java的背景,我是Python的新手。在继续之前,我想确保我正确理解Python术语。 我对模块的理解是:一个可以由许多脚本导入的脚本,以便于阅读。就像在java中一样,您有一个类,该类可以由许多其他类导入。 我对库的理解是:库包含许多模块,这些模块因其用途而相互分离。 我的问题是:图书馆就像包裹一样,你有一个包裹,例如叫做食物的包裹,那么: 巧克力。py 糖果。py 比斯切茨。py公司 是

    • 问题内容: JAR文件和软件包之间有什么区别吗? 问题答案: 包是一种 逻辑上 组织您的类的方法。例如,您可以在每个源文件的顶部声明足够相关以一起驻留在包中。Java编译器和运行时还将期望您将此类文件放置在path中,该路径的根是类路径中的目录或JAR。 JAR文件使您可以 物理上 组织您的班级。您可以获取任何Java文件(以及它们的父目录,遵循上面讨论的目录结构),并将它们存储在JAR文件中。一

    • 所以我试着把我的脑袋绕在构造函数、工厂函数、IIFE、闭包、模块模式的概念上,但我发现我在什么时候应该使用哪一个真的很困惑。引起我注意的是,工厂功能和模块模式真的很相似,举个例子: 有人能告诉我实际的区别是什么吗?感谢任何帮助!

    • 问题内容: Python模块和Python包之间有什么区别? 问题答案: 模块是单个文件(一个或多个文件),可在一个导入下导入并使用。例如 包是目录中提供包层次结构的模块的集合。

    • 问题内容: 我已经看到许多项目使用 模块而不是 标准库中的模块。另外,有许多不同的模块。为什么要使用这些替代方法而不是标准库中的替代方法? 问题答案: 是 ,已添加到stdlib中。但是自从2.6中添加以来,它具有处理更多Python版本(2.4+)的优势。 的更新频率也比Python高,因此,如果您需要(或想要)最新版本,则尽可能使用它自己。 我认为,一种好的做法是将其中一个作为后备。