当前位置: 首页 > news >正文

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

作者:京东科技 周波

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

相关文章:

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

图:模块化手机概念 一、什么是Java模块化 Java模块化(module)是Java9及以后版本引入的新特性。 官方对模块的定义为:一个被命名的,代码和数据的自描述集合。( the module, which is a named, self-descri…...

「Verilog学习笔记」移位运算与乘法

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 1、在硬件中进行乘除法运算是比较消耗资源的一种方法,想要在不影响延迟并尽量减少资源消耗,必须从硬件的特点上进行设计。根据寄存器的原理&a…...

静态、友好、内在:解析C++中的这些特殊元素和对象复制的优化

W...Y的主页 😊 代码仓库分享💕 🍔前言: 前面我们学习了C中关于类与对象的许多知识点,今天我们继续学习类与对象,最后再总结一下类与对象中的一些关键字内容,以及需要注意的细节。满满的干货…...

【RabbitMQ】 RabbitMQ 消息的延迟 —— 深入探索 RabbitMQ 的死信交换机,消息的 TTL 以及延迟队列

文章目录 一、死信交换机1.1 什么是死信和死信交换机1.2 死信交换机和死信队列的创建方式 二、消息的 TTL2.1 什么是消息的 TTL2.2 基于死信交换机和 TTL 实现消息的延迟 三、基于 DelayExchang 插件实现延迟队列3.1 安装 DelayExchang 插件3.2 DelayExchang 实现消息延迟的原理…...

CVE-2023-34040 Kafka 反序列化RCE

漏洞描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块,用于简化在 Spring 应用程序中集成 Apache Kafka 的过程,记录 (record) 指 Kafka 消息中的一条记录。 受影响版本中默认未对记录配置 ErrorHandlingDeserializer,当用户将容…...

全局变量和局部变量在for循环的使用

imageloc字典作为全局变量,然后添加到全局的列表中,每次for循环都会将最新的元素改变之前for循环添加的元素。而imageloc字典作为局部变量,则不会影响。 import numpy as np originaljson [{"joints_vis": [1,1,1,1,1,1,1,1,1,1,…...

pytorch collate_fn测试用例

collate_fn 函数用于处理数据加载器(DataLoader)中的一批数据。在PyTorch中使用 DataLoader 时,通过设置collate_fn,我们可以决定如何将多个样本数据整合到一起成为一个 batch。在某些情况下,该函数需要由用户自定义以满足特定需求。 import …...

【qemu逃逸】HITB2017-babyqemu 2019数字经济-qemu

前言 由于本地环境问题,babyqemu 环境都没有起起,这里仅仅做记录,exp 可能不正确。 HITB2017-babyqemu 设备逆向 设备定位啥的就不说了,先看下实例结构体: 其中 dma_state 结构体如下: 这里看字段猜测…...

Docker Compose学习笔记

Docker Compose用来做什么? Docker Compose 是Docker官方的开源项目。 Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single …...

基于树 二叉树的回溯搜索算法(DPLL)

1)全称:Davis-Putnam-Logemann-Loveland 2)思想:基于树/二叉树的回溯搜索算法,主要基于两种策略。 单子句规则:如果一个CNF范式中存在单子句L(含有一个文字的子句),取L为…...

【嵌入式】适用于ESP32/ESP8266远程自动烧录工具

文章目录 介绍开始使用下载项目开启服务端开始远程烧录 后记 介绍 esp_remote_flash_tool 是一款基于 esptool.py 的远程自动烧录工具,支持 ESP32 和 ESP8266。 使用场景 基于 ESP-IDF 、ESP8266 NONO SDK、ESP8266 RTOS SDK 进行开发的项目项目代码存储在 Linux…...

服务器遭受攻击如何处理(记录排查)

本文的重点是介绍如何鉴别安全事件以及保护现场的方法,以确保服务器负责人能够在第一时间对安全攻击做出反应,并在最短时间内抵御攻击或减少攻击所带来的影响。 在服务器遭遇疑似安全事件时,通常可以从账号、进程、网络和日志四个主要方面进…...

分享81个工作总结PPT,总有一款适合您

分享81个工作总结PPT,总有一款适合您 PPT下载链接:https://pan.baidu.com/s/13hyrlZo2GhRoQjI-6z31-w?pwd8888 提取码:8888 Python采集代码下载链接:采集代码.zip - 蓝奏云 学习知识费力气,收集整理更不易。知识付…...

什么是DITA?从百度的回答说起

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 什么是DITA? 把这个问题输入百度,获得以下回答: DITA 是“Darwin Information Typing Architecture”(达尔文信息类型化体系结构)的缩写,它是IBM 公司为OASIS 所支持…...

线扫相机DALSA软件开发套件有哪些

Win10和Win7系统完整SDK目录截图: Sapera Configuration 缓存与内存管理,以及通信端口配置工具,部分功能等效于Detection(查找相机)内的Settings。 Sapera Log Viewer 打开Log Viewer后会显示之前发生过的所有与Sapera LT软件有关的运行信息…...

Scala集合操作

1 集合简介 Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类: 可变集合: 可以被修改。即可以更改,添加,删除集合中的元素; 不可变集合类:不能被修改。对集合执行更改,…...

SQL备忘--特殊状态“未知“以及“空值NULL“的判断

一、新逻辑状态:未知 对于大多数其他语言的逻辑判断,一般只有两种结果:真(TURE)或假(FALSE)但在SQL中,还会有第三种判断结果:未知(UNKNOWN),表示无法判断出真或者假。 未知状态会影响传统逻辑运算&#x…...

《Pytorch新手入门》第一节-认识Tensor

《Pytorch新手入门》第一节-认识Tensor 一、认识Tensor1.1 Tensor定义1.2 Tensor运算操作1.3 Tensor与numpy转换 参考《深度学习框架PyTorch:入门与实践_陈云(著)》 一、认识Tensor 1.1 Tensor定义 Tensor 是 PyTorch 中重要的数据结构,可认为是一个高…...

【JAVA学习笔记】55 - 集合-Map接口、HashMap类、HashTable类、Properties类、TreeMap类(难点)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter14/src/com/yinhai/map_ Map接口 一、Map接口的特点(难点) 难点在于对Node和Entry和EntrySet的关系 注意:这里讲的是JDK8的Map接口特点 Map java 1) Map与Collect…...

Pytorch图像模型转ONNX后出现色偏问题

本篇记录一次从Pytorch图像处理模型转换成ONNX模型之后,在推理过程中出现了明显色偏问题的解决过程。 问题描述:原始pytorch模型推理正常,通过torch.onnx.export()函数转换成onnx之后,推理时出现了比较明显的颜色偏差。 原始模型…...

AI Agent在智能风控中的实战:多智能体欺诈检测与预警

AI Agent在智能风控中的实战:多智能体欺诈检测与预警 你有没有过明明是正常交易却被银行冻结账户的糟糕体验?或是听说过某电商平台上线新活动首日就被黑产团伙薅走数千万补贴的新闻?随着黑产欺诈向团伙化、专业化、动态化演进,传统依赖规则引擎、单模型机器学习的风控体系已…...

Stitches API完全指南:从基础配置到自定义扩展

Stitches API完全指南:从基础配置到自定义扩展 【免费下载链接】stitches HTML5 Sprite Sheet Generator 项目地址: https://gitcode.com/gh_mirrors/sti/stitches Stitches是一款强大的HTML5 Sprite Sheet Generator,它提供了直观的API接口&…...

古戏台构件声学特性的时域有限差分方法【附模型】

✨ 长期致力于时域有限差分法、窑洞、戏台、八字墙、共形技术研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)曲面共形网格快速生成算法: …...

echarts中heatmap鼠标滚动禁用缩放,向下滚动

配置如下效果如下...

长期使用Token Plan套餐在项目开发中的成本观察

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Token Plan套餐在项目开发中的成本观察 在AI驱动的项目开发中,成本控制与预算管理是团队负责人必须面对的现实…...

集成Taotoken为OpenClaw工作流提供持久化模型支持

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 集成Taotoken为OpenClaw工作流提供持久化模型支持 在构建基于OpenClaw的自动化Agent工作流时,一个稳定且可灵活切换的模…...

render_async嵌套渲染:构建复杂异步界面的完整解决方案

render_async嵌套渲染:构建复杂异步界面的完整解决方案 【免费下载链接】render_async render_async lets you include pages asynchronously with AJAX 项目地址: https://gitcode.com/gh_mirrors/re/render_async 在现代Web开发中,页面加载速度…...

用PyTorch复现FactorVAE:一个能同时预测收益和风险的量化模型实战教程

用PyTorch实战FactorVAE:构建收益与风险双预测的量化模型 在量化投资领域,传统线性因子模型正逐渐被非线性机器学习方法所取代。然而金融数据特有的低信噪比特性,使得直接从市场数据中提取有效因子成为一项艰巨挑战。本文将深入探讨如何利用P…...

终极STL到STEP转换指南:如何实现3D打印模型到CAD设计的无缝衔接

终极STL到STEP转换指南:如何实现3D打印模型到CAD设计的无缝衔接 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在数字化制造和工程设计领域,STL到STEP转换已成为连接3D…...

理想二极管控制器:用MOSFET实现毫伏级压降的电源管理方案

1. 理想二极管控制器:告别传统二极管的压降损耗 在电源设计、电池保护、太阳能板并联这些领域里,二极管是个再常见不过的元件。我们用它来防反接、做整流、实现“或”逻辑供电,几乎不假思索。但如果你设计过一个需要处理大电流、低电压的系统…...