了解 Java 平台模块系统(Project Jigsaw)

8演进到 9及之后的版本引入了一项重要的新特性——模块化系统(Project Jigsaw)。模块化系统的目的是为了解决大型应用的依赖管理,提高性能,简化JRE,增强兼容性和安全性,提高开发效率。通过模块化,可以更好地支持微服务架构,提供更细粒度的封装和控制,依赖关系更清晰。

本文详细介绍了模块化系

统的概念,如主要参数、关键指令、模块化策略等,并提供了最佳实践,帮助开发者更好地理解和运用模块化系统。

通过使用巴拿马电话号码的资源,人们可以预 巴拿马电话号码资源 期客户参与度会达到顶峰,因为公司可以在更短的时间内接触到目标受众。使用准确的电话号码将使企业能够进行个性化的外展服务,从而大大提高客户互动和响应率。这种直接沟通有助于建立关系、品牌忠诚度,甚至提供获取实时反馈的机会。

1.模块化系统简介1.1发展历史如果把 8比作一个单片应用,那么在引入模块化系统之后,从 9开始,就变成了微服务。模块化系统,代号Jigsaw,最早是在2008年8月提出的(比Martin Fowler提出微服务早了6年)。 2014年正式进入开发阶段,最终在2017年9月随 9发布。

 

 模块化系统定义官方定义是

组具有唯一名称、可重用的相关包,以及资源(如图片、XML文件)和模块描述符。

如图所示,模块的载体是文件,模块就是文件。但与传统的文件相比,模块根目录下多了一个.class文件,即模块描述符,其中包含模块名称、所依赖的模块、模块中要导出的包[允许直接导入]、模块中要打开的包[允许通过反射访问]、所提供的服务、所依赖的服务等信息。任何文件都可以通过添加有效的模块描述符升级为模块。这个看似很小的变化,在我看来,至少带来了四个好处。

清晰的依赖管理

可以根据模块描述符计算各个模块 如何在牙科诊所组织财务会计:经验丰富的企业家解释 之间的依赖关系,一旦发现循环依赖,启动就会终止。

由于模块化系统不允许不同模块导出同一个包(即拆分包),因此  在搜索包时可以准确定位到某个模块,从而获得更好的性能。精简的 JRE引入模块化系统后,JDK 本身被划分为 94 个模块(如图所示),借助  9 中增加的 jlink 工具,开发者可以根据实际应用场景组合这些模块,移除不必要的模块,生成自定义的 JRE,从而有效减少 JRE 的大小。

得益于此JRE 11 的大小

只有 JRE 8 的 53%,从 218.4 MB 减小到 116.3 MB,广受诟病的大 rt. 文件也被移除。更小的JRE意味着更少的内存占用,这让对于嵌入式应用开发更加友好。直以来都只有四种可访问性,这大大降低了其对封装的支持。

在 9之后,借助模块描述符中的exports关 新加坡电话列表 键字,模块维护者可以精确控制哪些类可以公开使用,哪些类仅供内部使用,也就是说不再依赖文档,而是由编译器来保证。类可访问性的细化带来了更好的兼容性和安全性。 9之后,一改原来一再拖延的作风,遵循每半年一个大版本的发布策略,从2017年9月到2020年3月,从 9到 14,三年发布了六个版本,没有出现任何拖延,如下图所示。这无疑和引入模块化体系有关。

前面提到在 9之后

JDK被拆分成了94个模块,每个模块都有清晰的模块描述符,并有独立的单元测试。对于每个开发人员来说,每个人只需要专注于自己负责的模块,从而大大提高开发效率。区别就像是将单体应用架构升级为微服务架构,版本迭代速度快。

强封装性:模块化允许开发人员指定哪些是模块的公共API,哪些是内部实现,从而增强了封装性。这使得开发人员可以控制其代码对外界的可见性,从而降低耦合度,提高代码安全性。

明确的依赖管理在

模块化系统中,每个模块必须明确声明其所依赖的其他模块。这种明确的依赖声明促进了构建和维护大型项目的更清晰、更稳定的依赖管理机制。

3)提高性能:模块化系统帮助JVM和编译器做出更好的决策,因为它们确切地知道哪些模块会被使用,哪些不会。这可以缩短启动时间并减少内存使用量,尤其是在微服务和云原生应用场景中。

4) 更容易构建大型系统:模块化系统鼓励开发人员将大型复杂程序拆分为更小、更易于管理的部分。这种方法使构建、测试和维护大型系统变得更加容易,同时提高了代码的可重用性。

更好的安全性

模块化系统限制了对模块内部实现的不必要访问,从而降低了安全风险。它允许应用程序明确控制哪些部分是公开可访问的,从而增强了整个应用程序的安全性。

6) 减小应用程序大小:由于模块化允许应用程序仅包含所需的模块,因此可以删除未使用的模块,从而减小应用程序的总大小。当需要将其部署到资源受限的环境中时,这尤其有价值。

)简化模块间的模块描述符:通过强制模块间明确的界限,模块化有助于避免“ hell”,即项目中多个版本的文件造成的冲突和混乱。

核心概念 模块描述符概述

模块的核心是模块描述符,它对应根目录下的.class文件,这个类文件是从源代码根目录下的.编译而来的,为.设计了专门的语法,包括exports等关键字。

 

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注