写点什么

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

  • 2023-11-03
    北京
  • 本文字数:1411 字

    阅读完需:约 5 分钟

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:



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





以上是机器翻译,原文: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


作者:京东科技 周波

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

发布于: 刚刚阅读数: 4
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
jar包的精细化运营,Java模块化简介 | 京东云技术团队_Java_京东科技开发者_InfoQ写作社区