Java 9模块系统与模块化开发实践
背景简介
Java 9引入了Java平台模块系统,旨在解决传统JAR包管理方式带来的问题。模块化开发不仅可以提高代码的封装性和安全性,还能优化应用程序的结构。本文基于《Java 9平台模块系统》章节内容,深入探讨了模块化开发的实践和自定义运行时的创建过程。
模块化开发的实践
文件结构的调整
为了支持模块化,我们重新组织了文件结构,将视频文件和FXML文件放置在模块的资源文件夹中。这种结构的调整有助于模块化工具更好地管理和维护代码。
• VideoPlayer.fxml 和 sts117.mp4 文件,这些文件位于模块目录的 res 文件夹中,便于应用程序执行时读取。
• 类 VideoPlayer 和 VideoPlayerController 放置在包 com.deitel.videoplayer 中,以满足模块化的要求。
• 在模块的根目录下创建了 module-info.java 文件,声明模块依赖关系。
自动模块的应用
在开发VideoPlayer时使用的ControlsFX库并非设计为Java模块,但通过将JAR文件添加到模块路径,我们可以隐式地将其作为一个自动模块来使用。
• JAR文件隐式成为自动模块,可以被模块声明的requires指令指定。
• 自动模块隐式导出所有包,使得其他模块可以访问其公共类型。
• 自动模块隐式读取应用中的所有其他模块,包括其他自动模块。
代码变更
为了模块化,对代码进行了以下更改:
• VideoPlayer.fxml 中的控制器类名修改为使用其完全限定名。
• VideoPlayer.java 中FXML文件名修改,并添加了包声明。
• VideoPlayerController.java 中视频文件名修改,并添加了包声明。
自定义运行时的创建
使用 jlink 工具
jlink是JDK 9中新增的一个工具,用于创建自定义运行时映像。你可以仅包含执行给定应用程序或一组应用程序所必需的模块。
• 使用 jlink 可以创建更小巧的运行时环境,适用于资源受限的设备。
• 例如,创建仅包含java.base模块的运行时,或者创建包含特定应用程序及其依赖项的运行时。
模块依赖图和解析器
模块解析器用于确定模块间的依赖关系,并确保所需模块在执行时可用。通过添加诊断选项,可以查看解析器的步骤。
• 通过添加 -Xdiag:resolver 选项,可以查看解析器定位模块的过程。
• 了解模块解析过程有助于解决模块依赖问题和配置自定义运行时。
服务和服务加载器
服务机制
服务是一种允许模块发布和消费API的方法,而不需要了解对方的具体实现。ServiceLoader类提供了一种动态加载服务实现的方式。
• 使用服务和ServiceLoader可以创建松耦合的对象,增强模块间的灵活性和可维护性。
• 服务机制在模块化开发中扮演着重要的角色,有助于模块间的解耦。
总结与启发
通过阅读和实践Java 9模块系统的相关内容,我们可以看到模块化对于Java应用程序开发的深远影响。模块化不仅让应用程序的结构更加清晰,还提升了代码的安全性和可维护性。同时,通过使用jlink工具创建自定义运行时,我们可以为特定环境优化Java应用程序。服务和ServiceLoader的概念在模块化开发中提供了额外的灵活性,使得模块间的交互更加高效。
本文的实践表明,尽管模块化开发可能需要一定的学习成本,但它为Java应用程序带来了长期的益处。对于开发者来说,掌握Java 9模块系统是未来进行高效、现代化Java开发的关键一步。
参考文献
- Java 9平台模块系统(章节内容)
- jlink - Java的链接器用于创建自定义运行时映像
- 服务和ServiceLoader在模块化开发中的应用
通过实践模块化开发和创建自定义运行时,我们能够更好地理解Java 9模块系统,为未来开发更为高效和安全的Java应用程序打下坚实的基础。