jar包的精细化运营,Java模块化简介 | 京东云技术团队


图:模块化手机概念

一、什么是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结构:

JDK17将其拆成一个一个jmod:

而且,官方提供了文档对每一个模块进行了介绍:

模块描述
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

2、在代码根路径下创建文件module-info.java

定义模块名称,依赖的模块,以及导出的模块
image.png

3、编译Java项目

在编译后的目录中可以看到module-info.class文件

4、创建jmod文件

使用jmod create命令:

命令格式:
jmod create --class-path module-info.class文件对应的路径 输出的jmod文件名

image.png

四、如何启动可执行模块

上面咱们创建的模块中是有Main入口的可执行模块,
那么能不能像java -jar一样执行这个模块呢?

答案是肯定的:

使用java --module命令:

命令格式:
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

作者:京东科技 周波

来源:京东云开发者社区 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/117039.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Rocky9 上安装 redis-dump 和redis-load 命令

一、安装依赖环境 1、依赖包 dnf -y install perl gcc gcc-c zlib-devel2、编译openssl 1.X ### 下载编译 wget https://www.openssl.org/source/openssl-1.1.1t.tar.gz tar xf openssl-1.1.1t.tar.gz cd openssl-1.1.1t ./config --prefix/usr/local/openssl make make ins…

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG

【移远QuecPython】EC800M物联网开发板的硬件PWM和PWM输出BUG 文章目录 导入库初始化PWM开启PWMPWM硬件BUG附录:列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 导入库 from misc import PWM_V2或者 from misc import PWM但我觉得PWM_V2好用 初…

【Linux】基础IO之文件操作(文件fd)——针对被打开的文件

系列文章目录 文章目录 系列文章目录前言浅谈文件的共识 一、 回忆c语言对文件操作的接口1.fopen接口和cwd路径2.fwrite接口和"w","a"方法3.fprintf接口和三个默认打开的输入输出流(文件) 二、过渡到系统,认识…

嵌入式中利用VS Code 远程开发原理

VS Code几乎是所有的程序员必备的工具之一,据说全球一般的开发者都使用过VS Code这款工具。 今天分享一篇 VS Code 实现远程办公相关的文章。 1、概 述 通常,我们都是每天到工作的办公室进行办公,但是,如果下班回家&#x…

chrome 扩展 popup 弹窗的使用

popup的基本使用方法 popup介绍 popup 是点击 browser_action 或者 page_action图标时打开的一个小窗口网页,焦点离开网页就立即关闭,一般用来做一些临时性的交互。 popup配置 V3版本中(V2版本是在 browser_action 中 )&#x…

用户自定义消息及层次划分

有些人对术语 WM_USER 表示消息范围基的名称有不同的意见,因为 WM_USER 是由窗口类的实现者来定义的。他们抱怨的是,用户不能使用它们,因为它们属于窗口类定义的一部分。 但是,问题是,”这里的用户是谁?”…

【IDEA】在工具栏设置快速创建包和类的图表

页面效果: 操作步骤: 设置 --> 外观与行为 --> 菜单与工具栏 --> 点击 主工具栏 --> 点击 ---- --> 点击 号 --> 添加操作 主菜单 --> 文件 --> 文件打开操作 --> 打开项目操作 --> 新建 --> 往下找 找到 clas…

模型应用系实习生-模型训练笔记(更新至线性回归、Ridge回归、Lasso回归、Elastic Net回归、决策树回归、梯度提升树回归和随机森林回归)

sklearn机械学习模型步骤以及模型 一、训练准备(x_train, x_test, y_train, y_test)1.1 导包1.2 数据要求1.21 导入数据1.22 数据类型查看检测以及转换1.22 划分数据 二、回归2.1 线性回归2.2 随机森林回归2.3 GradientBoostingRegressor梯度提升树回归2…

HarmonyOS列表组件

List组件的使用 import router from ohos.routerEntry Component struct Index {private arr: number[] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]build() {Row() {Column() {List({ space: 10 }) {ForEach(this.arr, (item: number) > {ListItem() {Text(${item}).width(100%).heig…

大语言模型对齐技术 最新论文及源码合集(外部对齐、内部对齐、可解释性)

大语言模型对齐(Large Language Model Alignment)是利用大规模预训练语言模型来理解它们内部的语义表示和计算过程的研究领域。主要目的是避免大语言模型可见的或可预见的风险,比如固有存在的幻觉问题、生成不符合人类期望的文本、容易被用来执行恶意行为等。 从必…

账户权限控制

1.首先配置一个单群组4节点的链 1.1创建操作目录 cd ~ && mkdir -p fisco && cd fisco 1.2下载国内脚本 curl -#LO https://osp-1257653870.cos.ap-guangzhou.myqcloud.com/FISCO-BCOS/FISCO-BCOS/releases/v2.9.1/build_chain.sh && chmod ux bu…

MobaXterm使用VNC远程显示和控制ubuntu桌面

目录 1 在ubuntu中安装vnc 2 设置ubuntu远程连接 3 MobaXterm中连接ubuntu的vnc 1 在ubuntu中安装vnc 参考:Ubuntu18.04~Ubuntu22.04安装并配置VNC_ubuntu安装vnc-CSDN博客 大体流程就是在ubuntu中安装vnc,设置密码,然后配置服务&#x…

万物皆可“云” 从杭州云栖大会看数智生活的未来

文章目录 前言一、云栖渐进:一个科技论坛的变迁与互联网历史互联网创新创业飞天进化飞天智能驱动数字中国 二、2023云栖大会:云计算人工智能 玩出科技跨界新花样大会亮点重磅嘉宾热门展览算力馆人工智能馆产业创新馆 总结 前言 10月31日,202…

网络编程 - HTTP协议

目录 HTTP协议格式 一,请求格式 1.1 URL的基本格式 1.2 方法(method) 1.3 请求头header 二,响应格式 2.1 状态码 HTTP协议格式 HTTP协议与之前讲的TCP/IP协议不同,HTTP协议要分为两个部分——请求和响应,也就是一种"一…

路由器基础(九):防火墙基础

防火墙 (Fire Wall) 是网络关联的重要设备,用于控制网络之间的通信。外部网络用户的访问必须先经过安全策略过滤,而内部网络用户对外部网络的访问则无须过滤。现在的防火墙还具有隔离网络、提供代理服务、流量控制等功能。 一、三种防火墙技术 常见的…

云智慧联合北航提出智能运维(AIOps)大语言模型及评测基准

随着各行业数字化转型需求的不断提高,人工智能、云计算、大数据等新技术的应用已不仅仅是一个趋势。各行业企业和组织纷纷投入大量资源,以满足日益挑剔的市场需求,追求可持续性和竞争力,这也让运维行业迎来了前所未有的挑战和机遇…

Git Rebase 优化项目历史

在软件开发过程中,版本控制是必不可少的一环。Git作为当前最流行的版本控制系统,为开发者提供了强大的工具来管理和维护代码历史。git rebase是其中一个高级特性,它可以用来重新整理提交历史,使之更加清晰和线性。本文将详细介绍g…

FFmpeg——使用Canvas录制视频尚存问题的解决方案

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

creating server tcp listening socket 127.0.0.1:6379: bind No error

window下启动redis服务报错: creating server tcp listening socket 127.0.0.1:6379: bind No error 解决方案如下按顺序输入如下命令即可连接成功 redis-cli.exeshutdownexit运行:redis-server.exe redis.windows.conf shutdown出现以下错误&#xff…