圖:模塊化手機(jī)概念
一、什么是Java模塊化
Java模塊化(module)是Java9及以后版本引入的新特性。
官方對(duì)模塊的定義為:一個(gè)被命名的,代碼和數(shù)據(jù)的自描述集合。( the module, which is a named, self-describing collection of code and data)。
早在Java7的時(shí)候就被提出,但由于其復(fù)雜性,不斷跳票,直到Java9才有,那么Java模塊化到底是什么,在實(shí)際開(kāi)發(fā)中又有什么用呢?
簡(jiǎn)單來(lái)說(shuō),就是把jar進(jìn)一步掰碎。
一個(gè)jar可以有多個(gè)module,一個(gè)module可以有多個(gè)package。
從代碼結(jié)構(gòu)上看,jar > module > package > class/interface。
那么怎么掰碎Jar包呢?
Java從自身做了一個(gè)典范,把JDK里面大部分Jar都掰成了一個(gè)個(gè)module
JDK1.8結(jié)構(gòu):
JDK17將其拆成一個(gè)一個(gè)jmod:
而且,官方提供了文檔對(duì)每一個(gè)模塊進(jìn)行了介紹:
模塊 | 描述 |
---|---|
java.base | 定義 Java SE 平臺(tái)的基礎(chǔ) API。 |
java.compiler | 定義語(yǔ)言模型、注釋處理和 Java 編譯器 API。 |
java.datatransfer | 定義用于在應(yīng)用程序之間和應(yīng)用程序內(nèi)傳輸數(shù)據(jù)的 API。 |
java.desktop | 定義 AWT 和 Swing 用戶界面工具包,以及用于 輔助功能、音頻、成像、打印和 JavaBeans。 |
java.instrument | 定義允許代理 檢測(cè)在 JVM 上運(yùn)行的程序。 |
java.logging | 定義 Java 日志記錄 API。 |
java.management | 定義 Java 管理擴(kuò)展 (JMX) API。 |
java.management.rmi | 定義 Java 管理擴(kuò)展插件 (JMX) 遠(yuǎn)程 API 的?RMI 連接器。 |
java.naming | 定義 Java 命名和目錄接口 (JNDI) API。 |
java.net.http | 定義 HTTP 客戶端和 WebSocket API。 |
java.prefs | 定義首選項(xiàng) API。 |
java.rmi | 定義遠(yuǎn)程方法調(diào)用 (RMI) API。 |
java.scripting | 定義腳本 API。 |
java.se | 定義 Java SE 平臺(tái)的 API。 |
java.security.jgss | 定義 IETF 通用安全服務(wù) API (GSS-API) 的 Java 綁定。 |
java.security.sasl | 定義對(duì) IETF 簡(jiǎn)單身份驗(yàn)證和安全層的 Java 支持 (薩斯?fàn)枺?/td> |
java.smartcardio | 定義 Java 智能卡 I/O API。 |
java.sql | 定義 JDBC API。 |
java.sql.rowset | 定義 JDBC 行集 API。 |
java.transaction.xa | 定義用于在 JDBC 中支持分布式事務(wù)的 API。 |
java.xml | 定義 Java API for XML Processing (JAXP)、Streaming API for XML (StAX), XML 的簡(jiǎn)單 API (SAX) 和 W3C 文檔對(duì)象模型 (DOM) API。 |
java.xml.crypto | 定義 XML 加密的 API。 |
jdk.accessibility | 定義輔助技術(shù)實(shí)現(xiàn)者使用的 JDK 實(shí)用程序類。 |
jdk.attach | 定義附加 API。 |
jdk.charset | 提供字符集?不在(主要是雙字節(jié)和 IBM 字符集)。java.base |
jdk.compiler | 定義系統(tǒng) Java 編譯器及其命令行等效項(xiàng)?javac?的實(shí)現(xiàn)。 |
jdk.crypto.cryptoki | 提供 SunPKCS11 安全提供程序的實(shí)現(xiàn)。 |
jdk.crypto.ec | 提供 SunEC 安全提供程序的實(shí)現(xiàn)。 |
jdk.dynalink | 定義用于動(dòng)態(tài)鏈接對(duì)象高級(jí)操作的 API。 |
jdk.editpad | 提供?jdk.jshell?使用的編輯板服務(wù)的實(shí)現(xiàn)。 |
jdk.hotspot.agent | 定義熱點(diǎn)功能配置代理的實(shí)現(xiàn)。 |
jdk.httpserver | 定義特定于 JDK 的 HTTP 服務(wù)器 API。 |
jdk.jartool | 定義用于操作 Java 歸檔 (JAR) 文件的工具, 包括?jar?和?jarsigner?工具。 |
jdk.javadoc | 定義系統(tǒng)文檔工具及其命令行等效項(xiàng)?javadoc?的實(shí)現(xiàn)。 |
jdk.jcmd | 定義用于診斷和排除 JVM 故障診斷的工具 如JCMD,JPS,JSTAT工具。 |
jdk.jconsole | 定義 JMX 圖形工具,jconsole, 用于監(jiān)視和管理正在運(yùn)行的應(yīng)用程序。 |
jdk.jdeps | 定義用于分析 Java 庫(kù)和程序中依賴關(guān)系的工具, 包括?JDEPS、JavaP?和?JDEPRSCAN?工具。 |
jdk.jdi | 定義 Java 調(diào)試接口。 |
jdk.jdwp.agent | 提供 Java 調(diào)試線路協(xié)議 (JDWP) 代理的實(shí)現(xiàn)。 |
jdk.jfr | 定義 JDK 飛行記錄器的 API。 |
jdk.jlink | 定義用于創(chuàng)建運(yùn)行時(shí)的?jlink?工具 圖像,用于創(chuàng)建和操作的?JMod?工具 JMOD文件,以及用于檢查的jimage工具 類和資源的特定于 JDK 實(shí)現(xiàn)的容器文件。 |
jdk.jshell | 此模塊提供對(duì) Java 編程語(yǔ)言“片段”評(píng)估工具,例如 讀取-評(píng)估-打印循環(huán) (REPL),包括?jshell?工具。 |
jdk.jsobject | 定義 JavaScript 對(duì)象的 API。 |
jdk.jstatd | 定義用于啟動(dòng)守護(hù)程序的?jstatd?工具 用于遠(yuǎn)程監(jiān)控 JVM 統(tǒng)計(jì)信息的 JSTAT 工具。 |
jdk.localedata | 提供美國(guó)區(qū)域設(shè)置以外的區(qū)域設(shè)置的區(qū)域設(shè)置數(shù)據(jù)。 |
jdk.management | 為 JVM 定義特定于 JDK 的管理接口。 |
jdk.management.agent | 定義 JMX 管理代理程序。 |
jdk.management.jfr | 定義 JDK 飛行記錄器的管理接口。 |
jdk.naming.dns | 提供 DNS Java 命名提供程序的實(shí)現(xiàn)。 |
jdk.naming.rmi | 提供 RMI Java 命名提供程序的實(shí)現(xiàn)。 |
jdk.net | 定義特定于 JDK 的網(wǎng)絡(luò) API。 |
jdk.pack | 定義用于將 JAR 文件轉(zhuǎn)換為壓縮包200 文件的工具 并將打包文件轉(zhuǎn)換為 JAR 文件,包括 pack200 和?unpack200?工具。 |
jdk.rmic | 定義用于生成存根的?rmic?編譯器和 對(duì)遠(yuǎn)程對(duì)象使用 Java 遠(yuǎn)程方法協(xié)議 (JRMP) 的框架。 |
jdk.scripting.nashorn | 提供 Nashorn 腳本引擎的實(shí)現(xiàn)和 用 ECMAScript 5.1 編寫(xiě)的程序的運(yùn)行時(shí)環(huán)境。 |
jdk.sctp | 為 SCTP 定義特定于 JDK 的 API。 |
jdk.security.auth | 提供接口和各種身份驗(yàn)證模塊的實(shí)現(xiàn)。javax.security.auth.* |
jdk.security.jgss | 定義 GSS-API 的 JDK 擴(kuò)展和 SASL 的實(shí)現(xiàn) GSSAPI機(jī)制。 |
jdk.xml.dom | 定義不屬于一部分的 W3C 文檔對(duì)象模型 (DOM) API 的子集 的 Java SE API。 |
jdk.zipfs | 提供 zip 文件系統(tǒng)提供程序的實(shí)現(xiàn)。 |
以上是機(jī)器翻譯,原文:https://docs.oracle.com/en/java/javase/11/docs/api/index.html
二、模塊化有什么好處
好處就是將jar的功能精細(xì)化,可以按需使用。
猜測(cè)是為了解決Java項(xiàng)目尤其是JVM一直被詬病比較臃腫的問(wèn)題,怎么解決臃腫呢?砍就完了!
-
進(jìn)一步規(guī)范Java的依賴
-
按需使用,最小化加載,減少?zèng)_突,減小Java應(yīng)用大小
-
可以對(duì)耦合性封裝性進(jìn)一步約束
-
使調(diào)用權(quán)限管理更清晰,提高系統(tǒng)的安全性
精簡(jiǎn)JRE就是模塊化一個(gè)典型的應(yīng)用:
1、maven編譯,打包項(xiàng)目,打包依賴jar到libs
2、使用新版JDK自帶的jdeps找出依賴的模塊
3、使用新版JDK自帶的jlink制作自定義JRE
三、如何創(chuàng)建模塊
1、創(chuàng)建一個(gè)Java項(xiàng)目或者module
2、在代碼根路徑下創(chuàng)建文件module-info.java
定義模塊名稱,依賴的模塊,以及導(dǎo)出的模塊
3、編譯Java項(xiàng)目
在編譯后的目錄中可以看到module-info.class文件
4、創(chuàng)建jmod文件
使用jmod create命令:
命令格式:jmod create --class-path module-info.class文件對(duì)應(yīng)的路徑 輸出的jmod文件名
四、如何啟動(dòng)可執(zhí)行模塊
上面咱們創(chuàng)建的模塊中是有Main入口的可執(zhí)行模塊,
那么能不能像java -jar一樣執(zhí)行這個(gè)模塊呢?
答案是肯定的:
使用java --module命令:
命令格式:java --module-path 模塊文件所在路徑 模塊名稱/包名.main類名
執(zhí)行后,就可以把java程序給運(yùn)行起來(lái)啦:
五、既然這么好,我們常用的Spring有沒(méi)有支持?
看到這里,同學(xué)們可能發(fā)現(xiàn)了,這需要整個(gè)Java生態(tài)開(kāi)發(fā)者所有人按規(guī)范對(duì)自己的Jar進(jìn)行模塊化才能達(dá)到最優(yōu)效果,而且實(shí)際開(kāi)發(fā)過(guò)程中定義和管理自己的模塊及模塊之間的依賴關(guān)系是比較復(fù)雜的事情。
這里有一個(gè)關(guān)于Java模塊化算不算復(fù)雜以及有沒(méi)有必要的知乎問(wèn)題,供大家參考:
https://www.zhihu.com/question/610866431?utm_id=0
那么我們常用的Spring有沒(méi)有被模塊化打動(dòng),也按規(guī)范進(jìn)行模塊化了呢?
至少到Spring5還沒(méi)有,但是這里有一些答案:
1:Declare Spring modules with JDK 9 module metadata
SpringFramework官方的回答:
https://github.com/spring-projects/spring-framework/issues/18079
機(jī)器翻譯:JDK 9的Jigsaw計(jì)劃旨在允許將模塊元數(shù)據(jù)(module-info.java)添加到框架和庫(kù)jar中,同時(shí)保持它們與JDK 8的兼容性。讓我們對(duì)Spring Framework 5.0的模塊盡可能地這樣做。然而,我們可能無(wú)法以這種方式表達(dá)我們的可選依賴安排,在這種情況下,我們可能不得不采用“自動(dòng)模塊”方法來(lái)實(shí)現(xiàn)#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
作者:京東科技 周波文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-741716.html
來(lái)源:京東云開(kāi)發(fā)者社區(qū) 轉(zhuǎn)載請(qǐng)注明來(lái)源文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-741716.html
到了這里,關(guān)于jar包的精細(xì)化運(yùn)營(yíng),Java模塊化簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!