具体描述
作者简介
目录信息
前言 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章 模块和模块化JDK 18
2.1 模块化JDK 19
2.2 模块描述符 22
2.3 可读性 23
2.4 可访问性 24
2.5 隐式可读性 25
2.6 限制导出 29
2.7 模块解析和模块路径 29
2.8 在不使用模块的情况下使用模块化JDK 31
第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 编译和封装的API 138
7.4 删除的类型 141
7.5 使用JAXB和其他Java EE API 142
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 使用jdeps 161
8.10 动态加载代码 164
8.11 拆分包 166
第9章 迁移案例研究:Spring和Hibernate 167
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 多版本JAR 192
10.7.2 模块化多版本JAR 195
第三部分 模块化开发工具
第11章 构建工具和IDE 198
11.1 Apache Maven 198
11.1.1 多模块项目 200
11.1.2 使用Apache Maven创建EasyText示例 200
11.1.3 使用Apache Maven运行模块化的应用程序 204
11.2 Gradle 205
11.3 IDE 205
第12章 测试模块 207
12.1 黑盒测试 208
12.2 使用JUnit进行黑盒测试 210
12.3 白盒测试 212
12.4 测试工具 216
第13章 使用自定义运行时映像进行缩减 217
13.1 静态链接和动态链接 218
13.2 使用jlink 219
13.3 查找正确的服务提供者模块 223
13.4 链接期间的模块解析 223
13.5 基于类路径应用程序的jlink 224
13.6 压缩大小 225
13.7 提升性能 227
13.8 跨目标运行时映像 228
第14章 模块化的未来 229
14.1 OSGi 230
14.2 Java EE 232
14.3 微服务 232
14.4 下一步 233
· · · · · · (收起)
读后感
原文:Cycles were supposed to be impossible. They are, at compile-time. 译文:循环通常被认为是不可能的。在编译时可能存在循环。 原文明明说的是编译时不允许存在循环依赖。(试译:按说循环依赖是不被允许的。没错,编译时是这样。)这么简单的一句话都能翻译成和原文完...
原文:Cycles were supposed to be impossible. They are, at compile-time. 译文:循环通常被认为是不可能的。在编译时可能存在循环。 原文明明说的是编译时不允许存在循环依赖。(试译:按说循环依赖是不被允许的。没错,编译时是这样。)这么简单的一句话都能翻译成和原文完...
原文:Cycles were supposed to be impossible. They are, at compile-time. 译文:循环通常被认为是不可能的。在编译时可能存在循环。 原文明明说的是编译时不允许存在循环依赖。(试译:按说循环依赖是不被允许的。没错,编译时是这样。)这么简单的一句话都能翻译成和原文完...
原文:Cycles were supposed to be impossible. They are, at compile-time. 译文:循环通常被认为是不可能的。在编译时可能存在循环。 原文明明说的是编译时不允许存在循环依赖。(试译:按说循环依赖是不被允许的。没错,编译时是这样。)这么简单的一句话都能翻译成和原文完...
原文:Cycles were supposed to be impossible. They are, at compile-time. 译文:循环通常被认为是不可能的。在编译时可能存在循环。 原文明明说的是编译时不允许存在循环依赖。(试译:按说循环依赖是不被允许的。没错,编译时是这样。)这么简单的一句话都能翻译成和原文完...
用户评价
这本《Java 9模块化开发》的深度和广度实在令人惊叹。从一开始对模块化概念的引入,作者就展现了扎实的理论功底和清晰的逻辑思维。书中对JPMS(Java Platform Module System)的解析,绝非停留在API的表面介绍,而是深入到了构建系统、依赖管理乃至运行时环境的底层机制。尤其是关于`module-info.java`文件的编写规范和策略,作者提供了大量的实战案例,这些案例不仅仅是简单的代码片段堆砌,而是模拟了真实企业级应用中模块划分的复杂场景。例如,书中对于如何处理遗留代码的迁移路径,给出的建议就极其具有操作性,避免了许多开发者在转向新范式时常遇到的“束手无策”的困境。书中对`requires static`、`requires transitive`以及`exports`的细微差别,讲解得抽丝剥茧,让读者能够深刻理解模块间可见性的控制哲学。对于那些希望彻底摆脱“一坨庞大代码库”阴影,构建清晰、可维护、高性能的Java应用的资深开发者来说,这本书无疑是一份宝贵的路线图。它不仅仅教会你“如何做”,更重要的是让你理解“为什么这么做”,这种思维层面的提升,远超出一本技术手册的价值。
我必须承认,我对Java 9模块化最初是抱持着一种观望甚至轻微抵触态度的,觉得这不过是Oracle又一次强行推行的新特性,带来的学习成本可能远高于实际收益。然而,拜读这本《Java 9模块化开发》之后,我的看法彻底转变了。这本书的叙述风格极其贴近一线开发者的实际痛点。作者没有采用那种高高在上的学术腔调,而是像一位经验丰富的架构师在和你面对面交流经验。书中关于模块化在性能优化上的作用,特别是对启动速度和内存占用的影响分析,数据详实且富有说服力。我特别欣赏其中关于“强封装”理念的阐述,它如何有效地遏制了反射滥用带来的隐性耦合问题,这在大型项目中简直是雪中送炭。书中的每一章都像是在解一个真实的“技术谜题”,从构建工具(如Maven/Gradle)如何适配JPMS,到如何设计跨模块的日志和配置系统,都给出了明确的、可执行的蓝图。读完后,我立刻组织团队进行了一次小规模的重构尝试,效果立竿见影,那种代码清晰度带来的“成就感”是久违的。
这本书的排版和逻辑组织,体现了极高的专业素养。它不是那种把所有东西一股脑塞给读者的教材,而是精心设计了一条学习路径。首先从“为什么需要模块化”建立心智模型,然后深入到“如何定义模块”,最后才是“如何部署和维护模块化系统”。我尤其赞赏作者在处理历史遗留问题时的谨慎态度。书中详细分析了JDK内部API的逐步移除过程,并提供了替代方案,这对于维护依赖于老版本JDK内部类的企业应用至关重要。阅读过程中,我发现作者对于不同构建工具链的适配性有着非常细致的考察,特别是Gradle和Maven在处理模块化依赖解析上的差异化处理,讲解得非常透彻,避免了开发者在工具选择上的迷茫。此外,书中对JVM的字节码层面对模块的校验和加载机制的解析,虽然技术性强,但行文流畅,没有让人感到晦涩难懂。它成功地将一个底层的、略显枯燥的平台特性,转化成了一项强大的工程工具。
与其他市面上流行的快速入门指南不同,《Java 9模块化开发》采取了一种更具批判性和实践导向的视角。它不仅仅教你如何使用`jlink`打包可执行运行时环境,更深入地探讨了模块化设计哲学对整个软件生命周期的影响。书中关于“开放模块”与“封闭模块”的边界策略讨论,极具启发性,它帮助我重新审视了我们团队内部代码库的访问权限设置。作者在案例中展示了如何利用模块机制实现真正意义上的“最小化运行时”,这对于云原生和容器化部署环境下的成本控制具有直接的经济价值。书中关于服务加载器(ServiceLoader)的现代应用方式,也刷新了我对插件化架构的认知,摆脱了过去那种依赖硬编码和配置文件的繁琐模式。这本书的价值在于,它提供了一种构建“未来”Java应用的方法论,即清晰的边界、可预测的依赖和高度的自描述性。对于那些追求代码健壮性和长期可维护性的架构师和技术负责人而言,这本书是一份不可或缺的战略投资。
对于初学者来说,可能需要一些耐心来消化这本书中的内容,因为它的密度相当高。但如果你已经对Java基础和面向对象设计有深入的理解,那么这本书将是你职业生涯中的一个重要转折点。它对模块化作为一种架构范式的深刻洞察,远超出了对Java特性的简单介绍。书中对于“可伸缩性”和“可测试性”如何通过模块边界的明确化得到天然保障的论述,堪称精彩绝伦。作者不仅探讨了内部API的隔离,还花了大篇幅讲解了面向服务的架构(SOA)与微服务设计中,模块化如何作为基础支撑层。其中关于“强依赖注入”与“模块化”结合的章节,提供了非常巧妙的设计模式,避开了传统上基于接口编程的潜在陷阱。更难能可贵的是,本书并未固步自封于Java 9,而是对后续版本中JPMS的演进(比如JLink工具的应用优化)也做了前瞻性的探讨,这使得这本书的保质期大大延长。阅读过程如同攀登一座知识的高峰,虽然每一步都需要集中注意力,但山顶的风景绝对值得。
此书详细的讲解了Java 9模块机制,重点说明了如何将程序与库进行模块化。可惜对 InteljIdea等开发工具使用模块化不够详细。
此书详细的讲解了Java 9模块机制,重点说明了如何将程序与库进行模块化。可惜对 InteljIdea等开发工具使用模块化不够详细。
此书详细的讲解了Java 9模块机制,重点说明了如何将程序与库进行模块化。可惜对 InteljIdea等开发工具使用模块化不够详细。
此书详细的讲解了Java 9模块机制,重点说明了如何将程序与库进行模块化。可惜对 InteljIdea等开发工具使用模块化不够详细。
毕竟模块化是java的深水区,作者从就模式分析,提出问题,解决问题.然后再引入模块的强依赖问题,再用服务化解决等.始终让人带着问题学习,对模块化理解加深很多.缺憾是后面几个章节都是蜻蜓点水的讲解,不够详细,另外部分页面翻译质量有待提高.