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
2、在代码根路径下创建文件module-info.java
定义模块名称,依赖的模块,以及导出的模块
3、编译Java项目
在编译后的目录中可以看到module-info.class文件
4、创建jmod文件
使用jmod create命令:
命令格式:
jmod create --class-path module-info.class文件对应的路径 输出的jmod文件名
四、如何启动可执行模块
上面咱们创建的模块中是有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之后,推理时出现了比较明显的颜色偏差。 原始模型…...

插值表达式 {{}}
前言 持续学习总结输出中,今天分享的是插值表达式 {{}} Vue插值表达式是一种Vue的模板语法,我们可以在模板中动态地用插值表达式渲染出Vue提供的数据绑定到视图中。插值表达式使用双大括号{{ }}将表达式包裹起来。 1.作用: 利用表达式进行…...

白雪公主
前言 #define 皇后 王后 在很久很久以前,有一个国王,由于王后难产致死,导致生下的孩子没母,由于缺爱,变的非常的刻薄 由于公主过于刻薄,以至于见到她的人都面色煞白感到空中飘雪 37C 的嘴怎能说出如此刻薄的话语。为了…...

宏观角度认识递归之合并两个有序链表
21. 合并两个有序链表 - 力扣(LeetCode) 依旧是利用宏观角度来看待问题,其中最主要的就是要找到重复的子问题; 题目中要求把两个有序链表进行合并,同时不能够创建新的节点,并返回链表的起始点:因…...

Leetcode-509 斐波那契数列
使用循环 class Solution {public int fib(int n) {if(n 0){return 0;}if(n 1){return 1;}int res 0;int pre1 1;int pre2 0;for(int i 2; i < n; i){res pre1 pre2;pre2 pre1;pre1 res;}return res;} }使用HashMap class Solution {private Map<Integer,Int…...

解密 docker 容器内 DNS 解析原理
背景 这几天在使用 docker 中,碰到了在容器中 DNS 解析的一些问题。故花些时间弄清了原理,写此文章分享。 1. docker run 命令启动的容器 以启动一个 busybox 容器为例: rootubuntu20:~# docker run -itd --name u1 busybox 63b59ca8aeac…...

故障诊断模型 | Maltab实现SVM支持向量机的故障诊断
效果一览 文章概述 故障诊断模型 | Maltab实现SVM支持向量机的故障诊断 模型描述 Chinese: Options:可用的选项即表示的涵义如下 -s svm类型:SVM设置类型(默认0) 0 – C-SVC 1 --v-SVC 2 – 一类SVM 3 – e -SVR 4 – v-SVR -t 核函数类型:核函…...

开源的网站数据分析统计平台——Matomo
Matomo 文章目录 Matomo前言一、环境准备1. 整体安装流程2.安装PHP 7.3.303.nginx配置4.安装matomo4.1 访问安装页面 http://192.168.10.45:8088/index.php4.2 连接数据库4.3 设置管理员账号4.4 生成js跟踪代码4.5 安装完成4.6 警告修改4.7 刷新页面,就可以看到登陆…...

linux入门到地狱
linux—001入门 IT圈必备(前端工作者用的比较少) 老旧电脑跑linux不容易卡 我代码没保存windows闪退,僵停(vs2019卡掉线),重启更新,占用cpu内存服务报错pip各种bug 出来生态环境友好其他的全是bug(bug时间成本超过了windows快捷友好生态) 那就说明wind…...

架构”4+1“视图
1995年Kruchten提出了著名的“41”视图,用来描述软件系统的架构。在“41”视图中,(物理视图 )用来描述系统软硬件之间的映射关系,这个视图往往(系统工程人员)最为关注;(逻…...

『精』Vue 组件如何模块化抽离Props
『精』Vue 组件如何模块化抽离Props 文章目录 『精』Vue 组件如何模块化抽离Props一、为什么要抽离Props二、选项式API方式抽离三、组合式API方式抽离3.1 TypeScript类型方式3.2 文件分离方式3.3 对文件分离方式优化 参考资料💘推荐博文🍗 一、为什么要抽…...