簡體   English   中英

模塊和JAR文件之間有什么區別?

[英]What is the difference between modules and JAR files?

我正在從Java9的新增功能中學習Java 9,討論中的熱門話題之一是Modular JDK

是JAR文件模塊嗎?

模塊與JAR文件有何不同?

模塊 :Java 9中引入的新語言功能(類似於類,接口,包等),它由包的集合組成,類似於包如何由類型的集合組成。

JAR :一種歸檔文件格式,捆綁了代碼和資源,並且可以由JVM加載。

更具體地說,模塊定義如下

為了以對開發人員而言易於使用並受現有工具鏈支持的方式提供可靠的配置和強大的封裝,我們將模塊視為一種基本的新型Java程序組件。 模塊是命名的,自描述的代碼和數據集合。 它的代碼被組織為一組包含類型(即Java類和接口)的軟件包。 其數據包括資源和其他種類的靜態信息。

...

模塊的自我描述在其模塊聲明中表達, 模塊聲明是Java編程語言的一種新結構。

...

按照慣例,模塊聲明被編譯module-info.classmodule-info.class的文件,類似地放置在class-file輸出目錄中。

可以將模塊編譯成Jar文件,在這種情況下,Jar文件被標記為模塊化Jar文件

現有工具已經可以創建,操縱和使用JAR文件,因此為了便於采用和遷移,我們定義了模塊化JAR文件 模塊化JAR文件在所有可能的方式上都與普通JAR文件類似,除了它的根目錄中還包含module-info.class文件。

模塊和JAR之間還有一些其他區別:

  1. 模塊可以要求其他模塊,以便允許require模塊訪問相關類。 Jar沒有這種依賴關系概念。

  2. 一個模塊可以決定將哪些類和接口導出到需要它的其他模塊。 Jar沒有這種封裝機制。

  3. 可以將一個模塊編譯成模塊化的Jar文件,但是將某些模塊(例如JDK模塊)編譯成另一種稱為JMOD的格式。

  4. 可以更改JAR的名稱。 只要JVM類裝入器在類路徑上找到所需的類(可以由單個JAR,多個JAR或目錄或JAR之間的混合組成),JAR文件的名稱就可以是任何東西。 但是,可以在其他模塊的聲明中顯式引用模塊的名稱,並且該名稱定義了該名稱,不能隨意更改。

嚴格來說, 模塊是運行時概念。 正如其他人在“模塊狀態”系統中所引用

模塊是命名的,自描述的代碼和數據集合。 它的代碼被組織為一組包含類型(即Java類和接口)的軟件包。 其數據包括資源和其他種類的靜態信息。

這與JAR非常相似,但是...

  1. JAR在運行時沒有有意義的表示
  2. JAR不是“自我描述”的,在這種情況下,這意味着它們沒有JVM關心的名稱,不能表達依賴關系或定義適當的API

這留下了問題,模塊從哪里來? 有多種方法,但是對於開發人員而言,最突出的一種方法是模塊化JAR。 模塊化的JAR就像普通的JAR一樣,但是它包含一個模塊描述符 ,即從module-info.java編譯而來的module-info.class文件。 該文件定義了模塊的名稱,依賴項和API

因此,JAR和模塊之間有很強的聯系:JAR是模塊系統用來從中創建模塊的容器,並且(目前)每個JAR只能包含一個模塊。 這是需要注意的是,即使Java的9 JAR文件不必是模塊化重要的-普通的JAR文件是完全的罰款。

是JAR文件模塊嗎? 模塊與JAR文件有何不同?

不, Java存檔不是Module

僅作為示例,雖然同一程序包的可以分散在各個JAR中 ,但是現在無法從多個模塊讀取同一程序包

JAR是一種文件格式,使您可以將多個文件捆綁到一個存檔文件中。 通常,它包含與小程序和應用程序關聯的類文件和輔助資源。

另一方面(我也嘗試過在這里描述這個〜>

模塊是命名的,自描述的代碼和數據集合。 它的代碼被組織為一包含類型(即Java類和接口) 的軟件包 其數據包括資源和其他種類的靜態信息。

這也包括在module-info.java的幫助下指定的模塊聲明。

每個模塊定義為

  • 模塊構件 ,即包含已編譯模塊定義的模塊化JAR文件或JMOD文件 ,否則

  • 分解模塊目錄 ,按照慣例,其名稱為模塊名稱,其內容為與軟件包層次結構相對應的“分解”目錄樹。

正如模塊系統所介紹的那樣,模塊化映像是由模塊而不是JAR文件組成的。 對於模塊化WAR文件的動態配置,也可以預見模塊化。


但是為了便於采用模塊 在JDK9中引入了模塊化JAR文件,因此可以說由module-info.java組成的模塊

module com.foo.bar { }

和其他java類

com/foo/bar/alpha/AlphaFactory.java
com/foo/bar/alpha/Alpha.java

現有工具已經可以創建,操縱和使用JAR文件。 模塊化JAR文件在所有可能的方式上都與普通JAR文件類似,除了它的根目錄中還包含module-info.class文件。 上面com.foo.bar module模塊化JAR文件,例如,可能具有以下內容:

 META-INF/ META-INF/MANIFEST.MF module-info.class com/foo/bar/alpha/AlphaFactory.class com/foo/bar/alpha/Alpha.class ... 

可以將模塊化JAR文件用作模塊,在這種情況下,將其module-info.class文件用於包含模塊的聲明。 也可以將其放在普通的類路徑上,在這種情況下,將忽略其module-info.class文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM