Java 9模块化开发
书籍作者:桑德·马克 |
ISBN:9787111601296 |
书籍语言:简体中文 |
连载状态:全集 |
电子书格式:pdf,txt,epub,mobi,azw3 |
下载次数:6857 |
创建日期:2021-02-14 |
发布日期:2021-02-14 |
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板 |
内容简介
Java9向Java平台引入了模块系统,这是一个非常重要的飞跃,标志着模块化Java软件开发的新纪元。当需要创建灵活且易于维护的代码时,模块化是一个关键的架构设计原则。本书给出了Java模块系统的明确概述,并演示了如何通过创建模块化应用程序来帮助管理以及降低复杂性。作者引导我们了解了模块系统中的相关概念以及工具,介绍了将现有代码迁移到模块中的模式以及以模块方式构建新应用程序的方法。
作者简介
桑德·马克(Sander Mak) 荷兰 Luminis公司的一名研究员,开发了许多主要用于JVM上的模块化以及可扩展软件,但也会在需要的地方使用TypeScript。他经常在各种会议上发言,并热衷于通过博客(http://branchandbound.net)和作为Pluralsight平台的讲师分享知识。
保罗·巴克(Paul Bakker) Netflix公司的一名高级软件工程师,在其Edge Developer Experience团队主要从事工具的开发,以提高公司内部开发人员的工作效率。曾与他人合作编著了《Modular Cloud Apps with OSGi》(由O''Reilly出版公司出版)一书。Paul经常在与模块化、容器技术相关主题的会议上发言。
编辑推荐
Java 9向Java平台引入了模块系统,这是一个非常重要的飞跃,标志着模块化Java软件开发的新纪元。当需要创建灵活且易于维护的代码时,模块化是一个关键的架构设计原则。本书给出了Java模块系统的明确概述,并演示了如何通过创建模块化应用程序来帮助管理以及降低复杂性。
作者引导我们了解了模块系统中的相关概念以及工具,介绍了可以将现有代码迁移到模块中的模式并以模块的方式构建新的应用程序。
? 了解Java平台自身如何实现模块化
? 学习模块化如何影响应用程序的设计、编译、打包以及开发
? 编写自己的模块
? 使用模式改进任意代码库的可维护性、灵活性以及重用性
? 学习如何使用服务来创建解耦模块
? 将现有代码迁移到模块,并学习如何使用并不是模块的现有库
? 创建优化的自定义运行时映像,从而改变装载模块化Java应用程序的方式
前言
前言Java 9向Java平台引入了模块系统,这是一个重大的飞跃,标志着Java平台上模块化软件开发的一个新时代的开始。看到这些变化让人感到非常兴奋,希望读者看完本书后也会感到兴奋。在深入了解模块系统之前需要做好充分利用该系统的准备。
本书读者本书为那些想要提高应用程序的设计和结构的Java开发者而编写。Java模块系统改进了设计和构建Java应用程序的方法。即使你不打算马上使用模块,了解JDK模块化本身也是非常重要的一步。在熟悉了本书第一部分所介绍的模块之后,希望你也能真正理解后续关于迁移的相关章节。
将现有代码移至Java 9和模块系统将成为一项越来越常见的任务。
本书绝不是对Java的一般性介绍。我们假设你拥有在一个团队中编写过较大Java应用程序的经验,在较大的Java应用程序中模块变得越来越重要。作为一名经验丰富的Java开发人员,应该认识到类路径所带来的问题,从而有助于理解模块系统及其功能。
除了模块系统之外,Java 9中还有许多其他变化。然而,本书主要关注模块系统及其相关功能。当然,在适当的情况下,在模块系统的上下文中也会讨论其他Java 9功能。
编写本书的原因很多读者从Java早期开始就是Java用户,当时Applet还非常流行。多年来,我们使用和喜欢过许多其他平台和语言,但 Java 仍然是主要工具。在构建可维护的软件方面,模块化是一个关键原则。多年来人们花费了大量精力来构建模块化软件,并逐渐热衷于开发模块化应用程序。曾经广泛使用诸如OSGi之类的技术来实现模块化,但Java平台本身并不支持这些技术。此外,还可通过Java之外的其他工具学习模块化,比如JavaScript的模块系统。当Java 9推出了期待已久的模块系统时,我们认为并不能只是使用该功能,还应该帮助其刚入职的开发人员了解模块系统。
也许在过去10年的某个时候你曾经听说过Jigsaw项目。经过多年的发展,Jigsaw项目具备了Java模块系统许多功能的原型。Java的模块系统发展断断续续。Java 7和Java 8最初计划包含Jigsaw项目的发展结果。
随着Java 9的出现,长期的模块化尝试最终完成了正式模块系统的实现。多年来,各种模块系统原型的范围和功能发生了许多变化。即使你一直在密切关注该过程,也很难弄清楚最终Java 9模块系统真正包含什么。本书将会给出模块系统的明确概述,更重要的是将介绍模块系统能够为应用程序的设计和架构做些什么。
本书内容本书共分为三个部分:
1)Java模块系统介绍。
2)迁移。
3)模块化开发工具。
第一部分主要介绍如何使用模块系统。首先从介绍模块化JDK本身开始,然后学习创建自己的模块,随后讨论可以解耦模块的服务,最后探讨模块化模式以及如何以最大限度地提高可维护性和可扩展性的方式使用模块。
第二部分主要介绍迁移。有可能读者现在所拥有的Java代码不是使用专为模块系统而设计的Java库。该部分介绍如何将现有代码迁移到模块中,以及如何使用尚未模块化的现有库。如果你是一名库的编写者或者维护者,那么这部分中有一章专门介绍了如何向库添加模块支持。
第三部分(也是最后一部分)主要介绍工具。该部分介绍了IDE的现状以及构建工具。此外还会学习如何测试模块,因为模块给(单元)测试带来了一些新的挑战,也带来了机会。最后学习链接(linking)——模块系统另一个引人注目的功能。
虽然建议从头到尾按顺序阅读本书,但是请记住并不是所有的读者都必须这样阅读。建议至少详细阅读前四章,从而具备基本知识,以便更好地阅读本书的其他章节。如果时间有限并且有现有的代码需要迁移,那么可以在阅读完前四章后跳到本书的第二部分。一旦完成了迁移,就可以回到“更高级”的章节。
使用代码示例本书包含了许多代码示例。所有代码示例都可以在GitHub(https://github.com/java9-modularity/examples)上找到。在该存储库中,代码示例是按照章节组织的。在本书中,使用下面的方法引用具体的代码示例:chapter3/helloworld,其含义是可以在“https://github.com/java9-modularity/examples/chapter3/helloworld”中找到示例。
强烈建议在阅读本书时使用相关的代码,因为在代码编辑器中可以更好地阅读较长的代码段。此外还建议亲自动手改写代码,如重现书中所讨论的错误。动手实践胜过读书。
排版约定下面列出的是书中所使用的字体约定:
斜体(Italic)表示新术语、URL、电子邮件地址、文件名以及文件扩展名。
等宽字体(Constant width)用于程序清单,以及在段落中引用程序元素,如变量或函数名称、数据库、数据类型、环境变量、语句和关键字。
等宽粗体(Constant width bold)显示应由用户逐字输入的命令或其他文本。
等宽斜体(Constant width italic)显示应该由用户提供的值或由上下文确定的值所替换的文本。
该图标表示一般注释。
该图标表示提示或者建议。
该图标表示警告或者提醒。
Safari在线电子书Safari(前身为Safari Books Online)是一个基于会员制的为企业、政府、教育工作者和个人提供培训和参考的平台。
目录
目录
前言1
第一部分 Java模块系统介绍
第1章 模块化概述8
1.1 什么是模块化9
1.2 在Java 9之前10
1.2.1 将JAR作为模块?11
1.2.2 类路径地狱13
1.3 Java 9模块14
第2章 模块和模块化JDK18
2.1 模块化JDK19
2.2 模块描述符22
2.3 可读性23
2.4 可访问性24
2.5 隐式可读性25
2.6 限制导出29
2.7 模块解析和模块路径29
2.8 在不使用模块的情况下使用模块化JDK31
第3章 使用模块33
3.1 第一个模块33
3.1.1 剖析模块33
3.1.2 命名模块35
3.1.3 编译36
3.1.4 打包37
3.1.5 运行模块37
3.1.6 模块路径39
3.1.7 链接模块40
3.2 任何模块都不是一座孤岛41
3.2.1 EasyText示例介绍41
3.2.2 两个模块43
3.3 使用平台模块46
3.3.1 找到正确的平台模块46
3.3.2 创建GUI模块47
3.4 封装的限制51
第4章 服务54
4.1 工厂模式54
4.2 用于实现隐藏的服务57
4.2.1 提供服务57
4.2.2 消费服务59
4.2.3 服务生命周期61
4.2.4 服务提供者方法62
4.3 工厂模式回顾64
4.4 默认服务实现65
4.5 服务实现的选择66
4.6 具有服务绑定的模块解析68
4.7 服务和链接70
第5章 模块化模式73
5.1 确定模块边界74
5.2 精益化模块76
5.3 API模块76
5.3.1 API模块中应该包含什么77
5.3.2 隐式可读性78
5.3.3 带有默认实现的API模块81
5.4 聚合器模块82
5.4.1 在模块上构建一个外观83
5.4.2 安全拆分模块84
5.5 避免循环依赖86
5.5.1 拆分包86
5.5.2 打破循环87
5.6 可选的依赖关系90
5.6.1 编译时依赖关系91
5.6.2 使用服务实现可选依赖关系95
5.7 版本化模块96
5.8 资源封装99
5.8.1 从模块加载资源100
5.8.2 跨模块加载资源101
5.8.3 使用ResourceBundle类102
第6章 高级模块化模式104
6.1 重温强封装性104
6.1.1 深度反射105
6.1.2 开放式模块和包106
6.1.3 依赖注入109
6.2 对模块的反射111
6.2.1 内省112
6.2.2 修改模块113
6.2.3 注释114
6.3 容器应用程序模式115
6.3.1 层和配置116
6.3.2 层中的类加载119
6.3.3 插件体系结构122
6.3.4 容器体系结构127
6.3.5 解析容器中的平台模块132
第二部分 迁移
第7章 没有模块的迁移134
7.1 类路径已经“死”了?135
7.2 库、强封装和JDK 9类路径135
7.3 编译和封装的API138
7.4 删除的类型141
7.5 使用JAXB和其他Java EE API142
7.6 jdk.unsupported模块145
7.7 其他更改146
第8章 迁移到模块148
8.1 迁移策略148
8.2 一个简单示例149
8.3 混合类路径和模块路径150
8.4 自动模块152
8.5 开放式包155
8.6 开放式模块157
8.7 破坏封装的VM参数158
8.8 自动模块和类路径158
8.9 使用jdeps161
8.10 动态加载代码164
8.11 拆分包166
第9章 迁移案例研究:Spring和Hibernate167
9.1 熟悉应用程序167
9.2 使用Java 9在类路径上运行172
9.3 设置模块173
9.4 使用自动模块174
9.5 Java平台依赖项和自动模块176
9.6 开放用于反射的包176
9.7 解决非法访问问题177
9.8 重构到多个模块178
第10章 库迁移180
10.1 模块化之前181
10.2 选择库模块名称181
10.3 创建模块描述符184
10.4 使用模块描述符更新库186
10.5 针对较旧的Java版本187
10.6 库模块依赖关系188
10.6.1 内部依赖关系188
10.6.2 外部依赖关系191
10.7 针对多个Java版本192
10.7.1 多版本JAR192
10.7.2 模块化多版本JAR195
第三部分 模块化开发工具
第11章 构建工具和IDE198
11.1 Apache Maven198
11.1.1 多模块项目200
11.1.2 使用Apache Maven创建EasyText示例200
11.1.3 使用Apache Maven运行模块化的应用程序204
11.2 Gradle205
11.3 IDE205
第12章 测试模块207
12.1 黑盒测试208
12.2 使用JUnit进行黑盒测试210
12.3 白盒测试212
12.4 测试工具216
第13章 使用自定义运行时映像进行缩减217
13.1 静态链接和动态链接218
13.2 使用jlink219
13.3 查找正确的服务提供者模块223
13.4 链接期间的模块解析223
13.5 基于类路径应用程序的jlink224
13.6 压缩大小225
13.7 提升性能227
13.8 跨目标运行时映像228
第14章 模块化的未来229
14.1 OSGi230
14.2 Java EE232
14.3 微服务232
14.4 下一步233