您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
jar包的精细化运营,Java模块化简介
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
jar包的精细化运营,Java模块化简介
yu****
2023-10-30
IP归属:北京
4200浏览
![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-09-21-20-10Crv8pZhXeKQHX8U.jpg) 图:模块化手机概念 ## 一、什么是Java模块化 ### Java模块化(module)是Java9及以后版本引入的新特性。 > 官方对模块的定义为:一个被命名的,代码和数据的自描述集合。( the module, which is a named, self-describing collection of code and data)。 早在Java7的时候就被提出,但由于其复杂性,不断跳票,直到Java9才有,那么Java模块化到底是什么,在实际开发中又有什么用呢? ### 简单来说,就是把jar进一步掰碎。 一个jar可以有多个module,一个module可以有多个package。 从代码结构上看,jar > module > package > class/interface。 ### 那么怎么掰碎Jar包呢? **Java从自身做了一个典范,把JDK里面大部分Jar都掰成了一个个module** JDK1.8结构: ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-09-21-20-45RIe7gKC8yu9fCC9.png) JDK17将其拆成一个一个jmod: ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-09-21-20-48ocnSQDCYLJAVAq21.png) 而且,官方提供了文档对每一个模块进行了介绍: | 模块 | 描述 | | --- | --- | | java.base | 定义 Java SE 平台的基础 API。 | java.compiler| 定义语言模型、注释处理和 Java 编译器 API。 | java.datatransfer | 定义用于在应用程序之间和应用程序内传输数据的 API。 | java.desktop | 定义 AWT 和 Swing 用户界面工具包,以及用于 辅助功能、音频、成像、打印和 JavaBeans。 | java.instrument | 定义允许代理 检测在 JVM 上运行的程序。 | java.logging | 定义 Java 日志记录 API。 | java.management | 定义 Java 管理扩展 (JMX) API。 | java.management.rmi | 定义 Java 管理扩展插件 (JMX) 远程 API 的 RMI 连接器。 | java.naming | 定义 Java 命名和目录接口 (JNDI) API。 | java.net.http | 定义 HTTP 客户端和 WebSocket API。 | java.prefs | 定义首选项 API。 | java.rmi | 定义远程方法调用 (RMI) API。 | java.scripting | 定义脚本 API。 | java.se | 定义 Java SE 平台的 API。 | java.security.jgss | 定义 IETF 通用安全服务 API (GSS-API) 的 Java 绑定。 | java.security.sasl | 定义对 IETF 简单身份验证和安全层的 Java 支持 (萨斯尔)。 | java.smartcardio | 定义 Java 智能卡 I/O API。 | java.sql | 定义 JDBC API。 | java.sql.rowset | 定义 JDBC 行集 API。 | java.transaction.xa | 定义用于在 JDBC 中支持分布式事务的 API。 | java.xml | 定义 Java API for XML Processing (JAXP)、Streaming API for XML (StAX), XML 的简单 API (SAX) 和 W3C 文档对象模型 (DOM) API。 | java.xml.crypto | 定义 XML 加密的 API。 | jdk.accessibility | 定义辅助技术实现者使用的 JDK 实用程序类。 | jdk.attach | 定义附加 API。 | jdk.charset | 提供字符集 不在(主要是双字节和 IBM 字符集)。java.base | jdk.compiler | 定义系统 Java 编译器及其命令行等效项 javac 的实现。 | jdk.crypto.cryptoki | 提供 SunPKCS11 安全提供程序的实现。 | jdk.crypto.ec | 提供 SunEC 安全提供程序的实现。 | jdk.dynalink | 定义用于动态链接对象高级操作的 API。 | jdk.editpad | 提供 jdk.jshell 使用的编辑板服务的实现。 | jdk.hotspot.agent | 定义热点功能配置代理的实现。 | jdk.httpserver | 定义特定于 JDK 的 HTTP 服务器 API。 | jdk.jartool | 定义用于操作 Java 归档 (JAR) 文件的工具, 包括 jar 和 jarsigner 工具。 | jdk.javadoc | 定义系统文档工具及其命令行等效项 javadoc 的实现。 | jdk.jcmd | 定义用于诊断和排除 JVM 故障诊断的工具 如JCMD,JPS,JSTAT工具。 | jdk.jconsole | 定义 JMX 图形工具,jconsole, 用于监视和管理正在运行的应用程序。 | jdk.jdeps | 定义用于分析 Java 库和程序中依赖关系的工具, 包括 JDEPS、JavaP 和 JDEPRSCAN 工具。 | jdk.jdi | 定义 Java 调试接口。 | jdk.jdwp.agent | 提供 Java 调试线路协议 (JDWP) 代理的实现。 | jdk.jfr | 定义 JDK 飞行记录器的 API。 | jdk.jlink | 定义用于创建运行时的 jlink 工具 图像,用于创建和操作的 JMod 工具 JMOD文件,以及用于检查的jimage工具 类和资源的特定于 JDK 实现的容器文件。 | jdk.jshell | 此模块提供对 Java 编程语言“片段”评估工具,例如 读取-评估-打印循环 (REPL),包括 jshell 工具。 | jdk.jsobject | 定义 JavaScript 对象的 API。 | jdk.jstatd | 定义用于启动守护程序的 jstatd 工具 用于远程监控 JVM 统计信息的 JSTAT 工具。 | jdk.localedata | 提供美国区域设置以外的区域设置的区域设置数据。 | jdk.management | 为 JVM 定义特定于 JDK 的管理接口。 | jdk.management.agent | 定义 JMX 管理代理程序。 | jdk.management.jfr | 定义 JDK 飞行记录器的管理接口。 | jdk.naming.dns | 提供 DNS Java 命名提供程序的实现。 | jdk.naming.rmi | 提供 RMI Java 命名提供程序的实现。 | jdk.net | 定义特定于 JDK 的网络 API。 | jdk.pack | 定义用于将 JAR 文件转换为压缩包200 文件的工具 并将打包文件转换为 JAR 文件,包括 pack200 和 unpack200 工具。 | jdk.rmic | 定义用于生成存根的 rmic 编译器和 对远程对象使用 Java 远程方法协议 (JRMP) 的框架。 | jdk.scripting.nashorn | 提供 Nashorn 脚本引擎的实现和 用 ECMAScript 5.1 编写的程序的运行时环境。 | jdk.sctp | 为 SCTP 定义特定于 JDK 的 API。 | jdk.security.auth | 提供接口和各种身份验证模块的实现。javax.security.auth.* | jdk.security.jgss | 定义 GSS-API 的 JDK 扩展和 SASL 的实现 GSSAPI机制。 | jdk.xml.dom | 定义不属于一部分的 W3C 文档对象模型 (DOM) API 的子集 的 Java SE API。 | jdk.zipfs | 提供 zip 文件系统提供程序的实现。 以上是机器翻译,原文:https://docs.oracle.com/en/java/javase/11/docs/api/index.html ## 二、模块化有什么好处 好处就是将jar的功能精细化,可以按需使用。 猜测是为了解决Java项目尤其是JVM一直被诟病比较臃肿的问题,怎么解决臃肿呢?砍就完了! * 进一步规范Java的依赖 * 按需使用,最小化加载,减少冲突,减小Java应用大小 * 可以对耦合性封装性进一步约束 * 使调用权限管理更清晰,提高系统的安全性 精简JRE就是模块化一个典型的应用: 1、maven编译,打包项目,打包依赖jar到libs 2、使用新版JDK自带的jdeps找出依赖的模块 3、使用新版JDK自带的jlink制作自定义JRE ## 三、如何创建模块 ### 1、创建一个Java项目或者module ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-09-22-15-1952tYiQFXpsndxyiL.png) ### 2、在代码根路径下创建文件module-info.java 定义模块名称,依赖的模块,以及导出的模块 ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-09-22-15-229oLEcJTyacxLKg6.png) ### 3、编译Java项目 在编译后的目录中可以看到module-info.class文件 ### 4、创建jmod文件 使用jmod create命令: ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-10-30-14-098cV54nEJf30Qo8UGt.png) 命令格式: `jmod create --class-path module-info.class文件对应的路径 输出的jmod文件名` ![image.png](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-09-22-15-23seHlYjBMg23CvDbX.png) ## 四、如何启动可执行模块 上面咱们创建的模块中是有Main入口的可执行模块, 那么能不能像java -jar一样执行这个模块呢? 答案是肯定的: 使用java --module命令: ![](https://s3.cn-north-1.jdcloud-oss.com/shendengbucket1/2023-10-30-14-09gMxh30QIxGxB934vO.png) 命令格式: `java --module-path 模块文件所在路径 模块名称/包名.main类名` 执行后,就可以把java程序给运行起来啦: ## 五、既然这么好,我们常用的Spring有没有支持? 看到这里,同学们可能发现了,这需要整个Java生态开发者所有人按规范对自己的Jar进行模块化才能达到最优效果,而且实际开发过程中定义和管理自己的模块及模块之间的依赖关系是比较复杂的事情。 > 这里有一个关于Java模块化算不算复杂以及有没有必要的知乎问题,供大家参考: > https://www.zhihu.com/question/610866431?utm_id=0 那么我们常用的Spring有没有被模块化打动,也按规范进行模块化了呢? 至少到Spring5还没有,但是这里有一些答案: ### 1:Declare Spring modules with JDK 9 module metadata > SpringFramework官方的回答: > https://github.com/spring-projects/spring-framework/issues/18079 > 机器翻译:JDK 9的Jigsaw计划旨在允许将模块元数据(module-info.java)添加到框架和库jar中,同时保持它们与JDK 8的兼容性。让我们对Spring Framework 5.0的模块尽可能地这样做。然而,我们可能无法以这种方式表达我们的可选依赖安排,在这种情况下,我们可能不得不采用“自动模块”方法来实现#18289中更温和的目的。 ### 2:Any plans for Java 9 Jigsaw (module) of Spring projects? > https://stackoverflow.com/questions/43685081/any-plans-for-java-9-jigsaw-module-of-spring-projects
上一篇:Java模块化应用实践之精简JRE
下一篇:体验问题哪里找?点击全文获取答案~
yu****
文章数
5
阅读量
674
作者其他文章
01
Java21上手体验-分代ZGC和虚拟线程
一、导语几天前Oracle刚刚发布了Java21,由于这是最新的LTS版本,引起了大家的关注。我也第一时间在个人项目中进行了升级体验。一探究竟,和大家分享。二、Java21更新内容介绍官方release公告:https://jdk.java.net/21/release-notes开源中国介绍:https://my.oschina.net/waylau/blog/10112170新特性一览:JEP
01
【后台体验】运营后台订单详情设计分享
目前大部分运营后台的设计和开发都是由后端同学来做,产品经理对界面标准要求并不高,大多数都是能用就行。其实,只要花些心思,运营后台也可以做的很美,提升运营同学的日常使用体验。下面跟大家分享两个我做的运营后台中的订单详情设计1.共享图书平台运营后台订单详情设计心路历程:产品经理并没有要求如何展示,仅提供想要看的内容,所以自由发挥如图该后台面向对象主要是仓库运营和图书运营人员,核心关注改订单包含哪些书
01
jar包的精细化运营,Java模块化简介
图:模块化手机概念一、什么是Java模块化Java模块化(module)是Java9及以后版本引入的新特性。官方对模块的定义为:一个被命名的,代码和数据的自描述集合。( the module, which is a named, self-describing collection of code and data)。早在Java7的时候就被提出,但由于其复杂性,不断跳票,直到Java9才有,那么
01
Java模块化应用实践之精简JRE
导语Java9及以后的版本引入了模块化特性,但是直到今天JDK21都发布了,依然没有被大量使用起来,那么这个特性就真的没啥意义了吗?别忘了,Java本身可是把模块化做到了极致的,所以可以利用这个特性对JRE本身进行定制化或者精简化。由于平时偶尔会开发一些Java的客户端应用,这时精简JRE的需求就凸显出来,让自己的程序带着最精简的JRE到处运行。实际实践了一段时间之后发现“真香!”现在把“利用Ja
yu****
文章数
5
阅读量
674
作者其他文章
01
Java21上手体验-分代ZGC和虚拟线程
01
【后台体验】运营后台订单详情设计分享
01
Java模块化应用实践之精简JRE
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号