关于Java:”包”和”模块”有什么区别?

What's the difference between “package” and “module”

我使用Java,我们只有包。我知道还有其他的编程语言也包括模块。

有什么区别?

谢谢


在虚空中很难比较语义。(你说的其他语言是什么意思?)一个"模块"可能类似于Java类,或者Java包,或者完全依赖于其他语言。通常,由于"模块"往往来自过程语言,我倾向于说Java类,但我认为在这一点上,这一行非常模糊,您可以很有说服力地对包进行辩论。


InstanceOfom的注释将其钉住——不同的语言对包和模块有不同的定义。因此,这个问题没有语言不可知论的答案。

我将尝试从我所知道的一些语言的角度来回答:

  • Java:它有一个packages的概念,它基本上只是一种将Java类、接口等组织到命名空间中的机制。它们需要层次结构。package没有头等舱地位。还值得注意的是,对于Java 7提出的EDCOX1的2度有时也被称为EDCOX1×3×S。

  • Modula:EDOCX1,3,s,在概念上与Java的EDCOX1,0,s相同,不需要层次结构。

  • E.Ocxx1,6,在概念上与Java的EDCOX1,0,s相同,不需要层次结构。

  • C++:EDCOX1×6,顾名思义,这些只是命名空间。不需要层次结构。

  • Haskell:EDCOX1,3,s,在概念上与Java的EDCOX1,0,s相同。

  • 斯卡拉:EDCX1〔0〕s在斯卡拉与爪哇的EDCX1〔0〕相同,只是不需要层次结构。还有一些限制,比如每个文件一个公共类,也被放宽了。scala中的objects也被称为模块,它们也享有一流的地位。

  • f:f中的namespaces与c namespaces相同。除了namespaces之外,f还具有modules,它们在clr级别用静态方法实现为.NET类。他们不是一流的实体。


似乎,正如其他答案所述,模块的概念因语言而异,有些甚至没有模块(但相应的对应模块)。

然而,现在看来,模块更像是一个概念,指的是一组可以独立共享的源代码文件。按照这个定义,JavaJAR文件不是模块,因为它们包含字节码编译文件(.class文件)。遵照这个定义的模块系统将在Java 9中引入(见本文),并且存在于具有模块或包管理器的其他语言中,通常直接命名模块包(Go Lang/Go工具、Python/PIP、PHP/作曲家……),其中包通常是打包模块。


Java9发布时引入了Java平台模块系统或JPMS。从那时起,Java既有EDCOX1,也有EDCX1,18,EDCX1,17。那么他们之间有什么区别呢?

什么是包裹?

A package is a namespace that organizes a set of related classes and
interfaces.

什么是模块?

A module is a collection of related Java packages and associated resources with a descriptor file, which contains information about which packages/resources are exposed by this module, which packages are used by current module and some other information.

我们可以把Java模块的东西作为一个更高层次的聚合。模块允许您将几个包组织成一个单独的逻辑单元,并将它们作为一个整体系统分发。此外,JPMS还提供了一种控制哪些包对用户可见的方法。


与模块相比,包更类似于C++命名空间。模块比包更类似于封闭类。