首页 > 编程语言 >jar包的精细化运营,Java模块化简介 | 京东云技术团队

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

时间:2023-11-03 12:36:35浏览次数:51  
标签:java 定义 jdk 模块化 jar API 模块 Java

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


图:模块化手机概念

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

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

JDK17将其拆成一个一个jmod:

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

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

模块

描述

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

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

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

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

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

3、编译Java项目

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

4、创建jmod文件

使用jmod create命令:

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


命令格式:

jmod create --class-path module-info.class文件对应的路径 输出的jmod文件名

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

四、如何启动可执行模块

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

答案是肯定的:

使用java --module命令:

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


命令格式:

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,定义,jdk,模块化,jar,API,模块,Java
From: https://blog.51cto.com/u_15714439/8163411

相关文章

  • Java 8: 异步利器 CompletableFuture vs Parallel Stream 选哪个
    应人们对性能和体验的要求,异步在项目中用的越来越多,CompletableFuture和ParallelStream无疑是异步并发的利器。既然两者都可以实现异步并发,那么带来一个问题:什么时候该使用哪个呢,哪个场景下使用哪个会更好呢?这篇文章因此出现,旨在当执行异步进行编程时CompletableFuture与Parall......
  • APK检测管理系统 JAVA开源项目 毕业设计
    https://gf.bilibili.com/item/detail/1104293029为了帮助小白入门Java,博主录制了本项目配套的《项目手把手启动教程》,希望能给同学们带来帮助。一、摘要基于JAVA+Vue+SpringBoot+MySQL的APK检测管理系统,包含了软件档案模块、软件检测模块、软件举报模块、开放平台模块,还包含系统......
  • JAVA技术栈的有福啦!这款IDEA插件,写完代码即可调试
    国产API调试工具Apipost推出IDEA插件,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。ApipostHelper=API调试工具+API管理工具+API搜索工具。在商店中搜索或直接点击下方链接即可下载:https://plugins.jetbrains.com......
  • JAVA技术栈的有福啦!这款IDEA插件,写完代码即可调试
    国产API调试工具Apipost推出IDEA插件,写完代码就可以调试接口并一键生成接口文档!而且还可以根据已有的方法帮助您快速生成url和params。ApipostHelper=API调试工具+API管理工具+API搜索工具。在商店中搜索或直接点击下方链接即可下载:https://plugins.jetbrains.com/p......
  • Java面试题:链表-合并两个排序的链表
    描述输入两个递增的链表,单个链表的长度为n,合并这两个链表并使新链表中的节点仍然是递增排序的。示例输入:{1,3,5},{2,4,6}返回值:{1,2,3,4,5,6}原题地址:https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337代码实现packagecom.example.demo.linked;......
  • java基础学习:path,java_home环境变量配置
    1.path变量: 装jdk后会自动配置java和javac的path路径 2.JAVA_HOME环境变量:   ......
  • JAVA内存分配
    1.类(包含该类的方法)的字节码文件进入方法区处于候命状态2.虚拟机调用了该类的方法后,方法进入栈内存,并执行方法3.当运行方法过程中出现了“new”,就会在堆内存中开辟对应空间,并把该空间的地址返回给arr变量记录,因此就可以通过arr找到对应的堆内存空间 注意: ......
  • java笔记_15_动态生成Excel文件
    //创建表头数据//内层List按纵向创建,外层List按横向添加,横向重复的名称会自动合并表格。List<List<String>>list=newArrayList<>();List<String>childList1=newArrayList<>();childList1.add("aaa");childList1.add("bbb");childList1.add......
  • JavaScript for循环语句的特殊案例,用代码解决数学中的问题
    案例一:一百个和尚分一百个馒头,大和尚一人分三个,小和尚三人分一个,正好分完。问大、小和尚各几人?varnum=100;varpeople=100;varbig,small;for(big=0;big<=33;big++){small=people-big;if(big*3+small/3==num){d......
  • JAVA基础
    打开CMD的方式1.开始+系统+命令指示符2.win+r(输入cmd)打开控制台3.在任意的文件夹下面按住(shift)+鼠标右键点击,在此处打开命令窗口4.资源管理器的地址栏前面加上cmd路径5.管理员方式运行(开始-windows系统-命令提示符-鼠标右键更多-管理员方式运行常用dos命令1.盘符切换:英......