jar包的精細化運營,Java模塊化簡介

来源:https://www.cnblogs.com/jingdongkeji/archive/2023/11/03/17807282.html
-Advertisement-
Play Games

早在Java7的時候就被提出,但由於其複雜性,不斷跳票,直到Java9才有,那麼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

作者:京東科技 周波

來源:京東雲開發者社區 轉載請註明來源


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • QQ空間自動點贊評論腳本 F12 控制台 對於主頁用以下代碼 var x=5,y=10; function autoClick() { y=y+10+Math.floor(Math.random()*10); var zan = document.getElementsByClassName('it ...
  • 退款業務強耦合到售後系統中,並且業務代碼分散到各個業務層,嚴重缺乏系統的領域邊界和分層設計,重構後退款業務邏輯不強依賴售後核心業務邏輯,做到可以獨立部署。 ...
  • 什麼是 PIP? PIP 是 Python 包管理器,用於管理 Python 包或模塊。註意:如果您的 Python 版本是 3.4 或更高,PIP 已經預設安裝了。 什麼是包? 一個包包含了一個模塊所需的所有文件。模塊是您可以包含在項目中的 Python 代碼庫。 檢查是否安裝了 PIP 在命令行 ...
  • Callable(簡單) callable介面和runnable介面類似,都是為了執行另外一條線程而設計的,區別是Runnable不會返回結果也不會拋出異常。 1、可以有返回值 2、可以拋出異常 3、方法不同;run()/call(); Runnable 實現Runnable介面,重寫run方法,無 ...
  • 記得學妹剛畢業那天,為了不讓學妹畢業就失業,連夜我就用Python採集了上萬份崗位,分析出最合適她的工作。 為此,學妹連夜來我家表示感謝😍 我們開始今天的正題吧 首先要準備這些 軟體 Python 3.8 Pycharm 模塊使用 requests # 數據請求模塊 pip install req ...
  • 說明 1. 或許是全網首發,我翻過很多文章,從未有一個博主講過這個東西,很多博主只講了IOC、DI和反射機制的常見用法,因類類型形參反射的巧妙用法有相當高的難度和學習盲區,所以從未有人講過類類型的形參它怎麼就被自動實例化的。 2. 在Laravel框架,或者是其它框架中,類的成員方法中形參的類型定義 ...
  • 歡迎訪問我的GitHub 這裡分類和彙總了欣宸的全部原創(含配套源碼):https://github.com/zq2599/blog_demos 本篇概覽 -《Go語言基準測試(benchmark)三部曲》已近尾聲,經歷了《基礎篇》和《記憶體篇》的實戰演練,相信您已熟練掌握了基準測試的常規操作以及各種 ...
  • 歸併排序和快速排序一樣,都是基於分治思想的應用。 通過遞歸,不斷將原數列分為兩個數列,然後再分別使其有序,最後通過歸併將兩個有序子數列合併為新的有序數列。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...