日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java模块是什么6_Java 9 揭秘(6. 封装模块)

發布時間:2024/10/12 java 99 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java模块是什么6_Java 9 揭秘(6. 封装模块) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tips

做一個終身學習的人。

Java 9

在這章節中, 主要介紹以下內容:

封裝Java模塊的不同格式

JAR格式增強

什么是多版本JAR

如何創建和使用多版本JAR

JMOD是什么格式

如何使用jmod工具來處理JMOD文件

如何創建、解壓和描述JMOD文件

如何列出JMOD文件的內容

如何在JMOD文件中記錄模塊的哈希值以進行依賴性驗證

模塊可以以不同的格式打包,以便在編譯時,鏈接時和運行時三個階段中使用。 但并不是在所有階段都支持這四種格式。 JDK 9支持以下格式打包模塊:

展開的目錄

JAR格式

JMOD格式

JIMAGE格式

在JDK 9之前支持展開的目錄和JAR格式。JDK 9中的JAR格式已得到增強,以支持模塊化JAR和多版本JAR。 JDK 9為封裝模塊引入了兩種新格式:JMOD格式和JIMAGE格式。 本節主要討論JAR格式和JMOD格式的增強。

一. JAR格式

在前面的第三者介紹了如何在jar工具中使用新的選項來創建模塊化的JAR。 jar工具還用于列出JAR文件中的條目,并提取和更新JAR文件的內容。 該jar工具在JDK 9之前已經支持這些操作,并且在JDK 9中沒有任何新的操作。在本章中,將介紹添加到JAR格式的新功能,稱為多版本JAR。

1. 什么是多版本JAR

作為一名經驗豐富的Java開發人員,你必須使用Java類庫/框架,例如Spring框架,Hibernate等。您可能正在使用Java 8,但這些類庫可能仍然在Java 6或Java 7中使用。為什么類庫開發人員不能使用最新版的JDK來使用新功能? 其中一個原因是不是所有的類庫使用者都使用最新的JDK。 更新類庫以使用較新版本的JDK意味著強制所有類庫用戶遷移到較新的JDK,這在實踐中是不可能的。 維護和發布針對不同JDK的類庫是打包代碼時的另一個痛苦。 通常,你將會找到一個用于不同JDK的單獨的庫JAR。 JDK 9通過為類庫開發人員提供一種打包類庫代碼的新方法來解決這個問題,使用單個JAR包含多個JDK的類庫的相同版本。 這樣的JAR被稱為多版本JAR。

多版本JAR(MRJAR)包含與多個JDK版本相同版本的類庫(提供相同的API)。 也就是說,可以將類庫作為可用于JDK 8和JDK 9的MRJAR。MRJAR中的代碼將包含在JDK 8和JDK 9中編譯的類文件。使用JDK 9編譯的類可以利用JDK 9提供的API,而使用JDK 8編譯的類可以提供使用JDK 8編寫的相同的類庫API。

MRJAR擴展了JAR的已有的目錄結構。 JAR包含其所有內容所在的根目錄。 它包含一個META-INF目錄,用于存儲有關JAR的元數據。 通常,JAR包含包含其屬性的META-INF/MANIFEST.MF文件。 典型的JAR中的條目如下所示:

- jar-root

- C1.class

- C2.class

- C3.class

- C4.class

- META-INF

- MANIFEST.MF

JAR包含四個class文件和一個MANIFEST.MF文件。 MRJAR擴展了META-INF目錄以存儲特定于JDK版本的類。 META-INF目錄包含一個版本子目錄,其中可能包含許多子目錄,每個目錄命名與JDK主要版本相同。 例如,對于特定于JDK 9的類,可能有META-INF/versions/9目錄,對于JDK 10特定的類,可能有一個名為META-INF/versions/10的目錄等。典型的MRJAR 可能有以下條目:

- jar-root

- C1.class

- C2.class

- C3.class

- C4.class

- META-INF

- MANIFEST.MF

- versions

- 9

- C2.class

- C5.class

- 10

- C1.class

- C2.class

- C6.class

如果該MRJAR在不支持MRJAR的環境中使用,則將被視為常規JAR ——根目錄中的內容將被使用,META-INF/version/9和 META-INF/versions/10目錄下的類將被忽略。 因此,如果這個MRJAR與JDK 8一起使用,則只能使用四個類:C1,C2,C3和C4。

當在JDK 9中使用這個MRJAR時,有五個類可以執行:C1,C2,C3,C4和C5。 將使用META-INF/versions/9目錄中的C2類,而不是根目錄中的C2類。 在這種情況下,MRJAR表示它具有JDK 9的C2類的較新版本,該版本覆蓋了JDK 8或更早版本的根目錄中的C2版本。 JDK 9版本還添加了一個名為C5的新類。

同樣,如果使用JDK 10,MRJAR會覆蓋類C1和C2類,并且包含JDK版本10的名為C6的新類。

在單個MRJAR中定位多個JDK版本,MRJAR中的搜索過程與常規JAR不同。 在MRJAR中搜索資源或類文件使用以下規則:

JDK的主版本是針對使用MRJAR的環境決定的。 這里假設JDK的主版本是N。

要查找名為R的資源或類文件,從版本N的目錄搜索META-INF/versions目錄下的特定平臺的子目錄。

如果在子目錄N中找到R,則返回。 否則搜索低于版本N的子目錄。 對于META-INF/versions目錄下的所有子目錄,此過程將繼續。

當在META-INF/versions/N子目錄中找不到R時,將搜索MRJAR的根目錄。

我們來看一下使用以前顯示的MRJAR結構的例子。 假設程序正在尋找C3.class,當前版本的JDK是10,搜索將從META-INF/versions/10開始,其中找不到C3.class。 在META-INF/versions/9中繼續搜索,其中找不到C3.class。 現在搜索繼續在根目錄中,最后找到C3.class。

另一個例子,假設你想在JDK版本為10時找到C2.class。搜索從META-INF/versions/10開始,其中找到并返回C2.class。

另一個例子,假設你想在JDK版本為9時找到C2.class。搜索從META-INF/versions/9開始,其中找到并返回C2.class。

另一個例子,假設你想在JDK版本為8時找到C2.class。沒有名為META-INF/versions/8的JDK 8特定目錄。 因此,搜索從根目錄開始,找到并返回C2.class。

Tips

在JDK 9中,處理JAR的所有工具(如java,javac和javap)都被修改為使用多版本的JAR。 處理JAR的API也已經更新,以處理多版本的JAR。

2. 創建多版本JAR

當在特定的JDK版本中搜索資源或類文件后,我們已經知道MRJAR中目錄的搜索順序,很容易了解如何找到類和資源。 有關JDK版本特定目錄內容的一些規則。 將在后面的章節中描述這些規則。 在本節中,將重點介紹創建MRJAR。

要運行此示例,需要在計算機上安裝JDK 8和JDK 9。 如果沒有JDK 8,除JDK 9之外的任何其他JDK都可以。 對于除版本8以外的JDK,將需要更改示例中的代碼,因此代碼將使用你本地版本的JDK進行編譯。

使用MRJAR來存儲應用程序的JDK 8和JDK 9版本。 該應用程序由以下兩個類組成:

com.jdojo.mrjar.Main

com.jdojo.mrjar.TimeUtil

Main類創建一個TimeUtil類的對象,并調用它的一個方法。Main類可以用作運行應用程序的主類。 TimeUtil類包含一個getLocalDate(Instant now)方法,它將Instant作為參數,并返回一個LocalDate類來表示當前時區的時間。 JDK 9已經為LocalDate類添加了一個新方法,它被命名為ofInstant(Instant instant, ZoneId zone)。 我們將更新應用程序以使用JDK 9并利用這種新方法,并保留使用JDK 8 中實現相同功能的Time API的舊應用程序。

源代碼包含兩個名為com.jdojo.mrjar.jdk8和com.jdojo.mrjar.jdk9的NetBeans項目,它們分別配置為使用JDK 8和JDK 9。 在NetBeans中,需要將com.jdojo.mrjar.jdk8項目的源和庫屬性更改為JDK 8,并將 com.jdojo.mrjar.jdk9項目更改為JDK 9。這些項目的源代碼很簡單。 可以在TimeUtil類中創建一個靜態方法的getLocalDate()方法。 在這里作為一個實例方法,所以你可以看到在輸出(稍后討論)哪個版本的實例化。 運行Main類時,會打印當前的本地日期,當你運行此示例時結果可能會有所不同。

下面包含使用JDK 8的TimeUtil和Main類的代碼。

// TimeUtil.java

package com.jdojo.mrjar;

import java.time.Instant;

import java.time.LocalDate;

import java.time.ZoneId;

public class TimeUtil {

public TimeUtil() {

System.out.println("Creating JDK 8 version of TimeUtil...");

}

public LocalDate getLocalDate(Instant now) {

return now.atZone(ZoneId.systemDefault())

.toLocalDate();

}

}

// Main.java

package com.jdojo.mrjar;

import java.time.Instant;

import java.time.LocalDate;

public class Main {

public static void main(String[] args) {

System.out.println("Inside JDK 8 version of Main.main()...");

TimeUtil t = new TimeUtil();

LocalDate ld = t.getLocalDate(Instant.now());

System.out.println("Local Date: " + ld);

}

}

下面包含使用JDK 9的TimeUtil和Main類的代碼模塊聲明為com.jdojo.mrjar。

// module-info.java

module com.jdojo.mrjar {

exports com.jdojo.mrjar;

}

// TimeUtil.java

package com.jdojo.mrjar;

import java.time.Instant;

import java.time.LocalDate;

import java.time.ZoneId;

public class TimeUtil {

public TimeUtil() {

System.out.println("Creating JDK 9 version of TimeUtil...");

}

public LocalDate getLocalDate(Instant now) {

return LocalDate.ofInstant(now, ZoneId.systemDefault());

}

}

// Main.java

package com.jdojo.mrjar;

import java.time.Instant;

import java.time.LocalDate;

public class Main {

public static void main(String[] args) {

System.out.println("Inside JDK 9 version of Main.main()...");

TimeUtil t = new TimeUtil();

LocalDate ld = t.getLocalDate(Instant.now());

System.out.println("Local Date: " + ld);

}

}

這個例子的目的不是單獨運行這兩個類,而是將它們全部包裝在MRJAR中并運行它們。

JDK 9中的jar工具已得到增強,以支持創建MRJAR。 在JDK 9中,jar工具接受一個新的選項,叫做--release。 其語法如下:

jar --release N

這里,N是一個JDK主版本,如JDK 9中的9。N的值必須大于或等于9。所有在--release N選項之后的所有文件將被添加到 MRJAR的META-INF/versions/N目錄下。

以下命令創建名為com.jdojo.mrjar.jar的MRJAR,并將其放在C:\ Java9Revealed\mrjars目錄下,該目錄是已經存在的目錄:

C:\Java9Revealed>jar --create --file mrjars\com.jdojo.mrjar.jar

-C com.jdojo.mrjar.jdk8\build\classes .

--release 9 -C com.jdojo.mrjar.jdk9\build\classes .

請注意在此命令中使用--release 9選項。 來自com.jdojo.mrjar.jdk9\ build\classes目錄的所有文件將被添加到MRJAR中的META-INF/versions/9目錄中。 來自com.jdojo.mrjar.jdk8\build\classes目錄的所有文件將被添加到MRJAR的根目錄下。 MRJAR中的條目將如下所示:

- jar-root

- com

- jdojo

- mrjar

- Main.class

- TimeUtil.class

- META-INF

- MANIFEST.MF

- versions

- 9

- module-info.class

- com

- jdojo

- mrjar

- Main.class

- TimeUtil.class

在創建MRJAR時,使用--verbose選項在jar工具中非常有幫助。 該選項打印出許多有用的信息,幫助診斷錯誤。 以下是與以前相同的命令,但使用了--verbose選項。 輸出顯示哪些文件被復制以及它們的位置:

C:\Java9Revealed>jar --create --verbose --file mrjars\com.jdojo.mrjar.jar

-C com.jdojo.mrjar.jdk8\build\classes .

--release 9 -C com.jdojo.mrjar.jdk9\build\classes .

輸出信息為:

added manifest

added module-info: META-INF/versions/9/module-info.class

adding: com/(in = 0) (out= 0)(stored 0%)

adding: com/jdojo/(in = 0) (out= 0)(stored 0%)

adding: com/jdojo/mrjar/(in = 0) (out= 0)(stored 0%)

adding: com/jdojo/mrjar/Main.class(in = 1100) (out= 592)(deflated 46%)

adding: com/jdojo/mrjar/TimeUtil.class(in = 884) (out= 503)(deflated 43%)

adding: META-INF/versions/9/(in = 0) (out= 0)(stored 0%)

adding: META-INF/versions/9/.netbeans_automatic_build(in = 0) (out= 0)(stored 0%)

adding: META-INF/versions/9/.netbeans_update_resources(in = 0) (out= 0)(stored 0%)

adding: META-INF/versions/9/com/(in = 0) (out= 0)(stored 0%)

adding: META-INF/versions/9/com/jdojo/(in = 0) (out= 0)(stored 0%)

adding: META-INF/versions/9/com/jdojo/mrjar/(in = 0) (out= 0)(stored 0%)

adding: META-INF/versions/9/com/jdojo/mrjar/Main.class(in = 1328) (out= 689)(deflated 48%)

adding: META-INF/versions/9/com/jdojo/mrjar/TimeUtil.class(in = 814) (out= 470)(deflated 42%)

假設要為MRJAR創建JDK的版本8,9和10。com.jdojo.mrjar.jdk10\build\classes目錄包含特定于JDK 10的類,則以下命令將執行該任務:

C:\Java9Revealed>jar --create --file mrjars\com.jdojo.mrjar.jar

-C com.jdojo.mrjar.jdk8\build\classes .

--release 9 -C com.jdojo.mrjar.jdk9\build\classes .

--release 10 -C com.jdojo.mrjar.jdk10\build\classes .

可以使用--list選項驗證MRJAR中的條目,如下所示:

C:\Java9Revealed>jar --list --file mrjars\com.jdojo.mrjar.jar

輸出結果為:

META-INF/

META-INF/MANIFEST.MF

com/

com/jdojo/

com/jdojo/mrjar/

com/jdojo/mrjar/Main.class

com/jdojo/mrjar/TimeUtil.class

META-INF/versions/9/

META-INF/versions/9/com/

META-INF/versions/9/com/jdojo/

META-INF/versions/9/com/jdojo/mrjar/

META-INF/versions/9/com/jdojo/mrjar/Main.class

META-INF/versions/9/com/jdojo/mrjar/TimeUtil.class

META-INF/versions/9/module-info.class

META-INF/versions/10/

META-INF/versions/10/com/

META-INF/versions/10/com/jdojo/

META-INF/versions/10/com/jdojo/mrjar/

META-INF/versions/10/com/jdojo/mrjar/TimeUtil.class

假設有一個包含JDK 8的資源和類文件的JAR,并且希望通過為JDK 9添加資源和類文件來更新JAR以使其成為MRJAR。可以通過使用以下命令來更新JAR的內容: --update。 以下命令創建僅具有JDK 8文件的JAR:

C:\Java9Revealed>jar --create --file mrjars\com.jdojo.mrjar.jar

-C com.jdojo.mrjar.jdk8\build\classes .

以下命令更新JAR以使其成為MRJAR:

C:\Java9Revealed>jar --update --file mrjars\com.jdojo.mrjar.jar

--release 9 -C com.jdojo.mrjar.jdk9\build\classes .

看看這個MRJAR的運作。 以下命令運行com.jdojo.mrjar包中的Main類,將MRJAR放在類路徑上。 JDK 8用于運行類。

C:\Java9Revealed> c:\java8\bin\java -classpath mrjars\com.jdojo.mrjar.jar com.jdojo.mrjar.Main

輸出結果為:

Inside JDK 8 version of Main.main()...

Creating JDK 8 version of TimeUtil...

Local Date: 2017-06-27

輸出顯示,從MRJAR的根目錄使用了兩個類Main和TimeUtil類,因為JDK 8不支持MRJAR。 以下命令使用模塊路徑運行相同的類。 在JDK 9中用于運行命令:

C:\Java9Revealed> c:\java9\bin\java --module-path mrjars\com.jdojo.mrjar.jar --module com.jdojo.mrjar/com.jdojo.mrjar.Main

輸出結果為:

Inside JDK 9 version of Main.main()...

Creating JDK 9 version of TimeUtil...

Local Date: 2017-06-27

輸出顯示,從MRJAR的META-INF/versions/9目錄中使用了兩個類Main和TimeUtil,因為JDK 9支持MRJAR,MRJAR具有JDK 9特有的這些類的版本。

讓我們給這個MRJAR一點點變化。 創建具有相同內容的MRJAR,但在META-INF/versions/9目錄中沒有Main.class文件。 在現實世界的場景中,只有TimeUtil類在應用程序的JDK 9版本中發生變化,因此不需要為JDK 9打包Main類。JDK 8的Main類也可用于JDK 9。 以下命令打包我們上次執行的所有操作,除了JDK 9的Main類之外。生成的MRJAR命名為com.jdojo.mrjar2.jar。

C:\Java9Revealed>jar --create --verbose --file mrjars\com.jdojo.mrjar2.jar

-C com.jdojo.mrjar.jdk8\build\classes .

--release 9

-C com.jdojo.mrjar.jdk9\build\classes module-info.class

-C com.jdojo.mrjar.jdk9\build\classes com\jdojo\mrjar\TimeUtil.class

可以使用以下命令驗證新MRJAR的內容:

C:\Java9Revealed>jar --list --file mrjars\com.jdojo.mrjar2.jar

輸出的結果為:

META-INF/

META-INF/MANIFEST.MF

META-INF/versions/9/module-info.class

com/

com/jdojo/

com/jdojo/mrjar/

com/jdojo/mrjar/Main.class

com/jdojo/mrjar/TimeUtil.class

META-INF/versions/9/com/jdojo/mrjar/TimeUtil.class

如果在JDK 8上運行Main類,將獲得與以前相同的輸出。 但是,在JDK 9上運行它會給你一個不同的輸出:

命令行命令:

C:\Java9Revealed>c:\java9\bin\java --module-path mrjars\com.jdojo.mrjar2.jar --module com.jdojo.mrjar/com.jdojo.mrjar.Main

輸出結果為:

Inside JDK 8 version of Main.main()...

Creating JDK 9 version of TimeUtil...

Local Date: 2017-06-27

輸出顯示Main類是在JAR根目錄使用的,而TimeUtil類使用的是META-INF/versions/9目錄下的。

4. 多版本JAR的規則

創建多版本JAR時,需要遵循一些規則。 如果你犯了一個錯誤,jar工具會打印錯誤信息。 有時,錯誤信息不直觀。最好使用--verbose選項運行jar工具來獲取有關錯誤的更多詳細信息。

大多數規則基于一個事實:MRJAR包含用于多個JDK平臺的類庫(或應用程序)的同一個版本的API。 例如,有一個名為jdojo-lib-1.0.jar的MRJAR,可能包含名為jdojo-lib的庫的1.0版本,該庫可能使用JDK 8和JDK 9中的API。這意味著該MRJAR應該提供一份相同的API(在公共類型及其公共成員方面),用在JDK 8的類路徑上,或JDK 9的類路徑或模塊路徑上。 如果MRJAR在JDK 8和JDK 9上提供不同的API,那么這不是有效的MRJAR。

二. 模塊化多版本JAR

MRJAR可以是模塊化JAR,在這種情況下,它可以在根目錄中包含一個模塊描述符module-info.class,在一個或多個版本化目錄中,或兩者的組合。 版本化描述符必須與根模塊描述符相同,但有一些例外:

一個版本描述符可以有不同的以java.*和jdk.*開頭模塊的非傳遞性requires 語句。

不同的模塊描述符對于非JDK模塊不能有不同的非傳遞性requires語句。

一個版本描述符可以有不同的uses語句。

這些規則是基于實現細節的變化是允許的,但是API本身并不是這樣。 允許對非JDK模塊的requires語句的更改被認為是API中的一個變化 —— 它要求你為不同版本的JDK擁有不同的用戶自定義的模塊。 這就是為什么這不允許的原因。

模塊化MRJAR不需要在根目錄中有一個模塊描述符。 這是我們在上一節的例子中所說的。 我們在根目錄中沒有模塊描述符,但在META-INF/versions/9目錄中有一個描述符。 這種安排可以在一個MRJAR中具有用于JDK 8的非模塊化代碼和用于JDK 9的模塊代碼。

三. 模塊化多版本JAR和封裝

如果在版本目錄(在根目錄中不存在)中添加新的公共類型,則在創建MRJAR時收到錯誤。假設在我們的示例中,為JDK 9版本添加一個名為Test的公共類。如果Test類在com.jdojo.mrjar包中,它將被該模塊導出,并且可用于MRJAR之外的代碼。請注意,根目錄不包含Test類,因此此MRJAR為JDK 8和JDK 9提供不同的公共API。在這種情況下,當您創建MRJAR時,在JDK 9的com.jdojo.mrjar包中添加公共Test類將會生成錯誤。

繼續使用相同的示例,假設將Test類添加到JDK 9的com.jdojo.test包中。請注意,該模塊不導出此包。當在模塊路徑上使用此MRJAR時,Test類將無法訪問外部代碼。在這個意義上,這個MRJAR為JDK 8和JDK 9提供了相同的公共API。但是,有一個隱情!你也可以將此MRJAR放在JDK 9中的類路徑上,在這種情況下,外部代碼可以訪問Test類,但這是對模塊化封裝的一種違反,以及違反MRJAR應該提供相同公共API的規則跨越不同的JDK版本。因此,不允許在MRJAR中為模塊添加公共類型到未導出的包。如果嘗試這樣做,將收到類似于以下內容的錯誤消息:

entry: META-INF/versions/9/com/jdojo/test/Test.class, contains a new public class not found in base entries

invalid multi-release jar file mrjars\com.jdojo.mrjar.jar deleted

有時,需要為同一個類庫添加更多類型來支持較新版本的JDK。 必須添加這些類型才能支持較新的實現。 可以通過將包級別的私有類型添加到MRJAR中的版本化目錄中來實現。 在這個例子中,如果使類非公開類型,可以添加JDK 9的Test類。

四. 多版本JAR和引導加載器

引導加載器不支持多版本JAR,例如,使用-Xbootclasspath / a選項指定MRJAR。支持這個將使得很少需要的功能的引導加載器實現變得復雜化。

五. 相同JDK版本的文件

MRJAR應該在版本目錄中包含相同文件的不同版本。 如果資源或類文件在不同的平臺版本中是相同的,那么這樣一個文件應該被添加到根目錄。 目前,如果jar工具在具有相同內容的多版本目錄中看到相同的條目,則會發出警告。

讓我們看看這個規則的實際效果。 將com.jdojo.mrjar.jdk9\build\目錄的內容復制到com.jdojo.mrjar.jdk10\build\classes目錄,因此這兩個目錄具有相同的內容。 運行以下命令創建一個包含JDK版本8,9和10的代碼的MRJAR。請注意,版本化目錄9和10中的文件將是相同的。 執行命令如下。

C:\Java9Revealed>jar --create --file mrjars\com.jdojo.mrjar.jar

-C com.jdojo.mrjar.jdk8\build\classes .

--release 9 -C com.jdojo.mrjar.jdk9\build\classes .

--release 10 -C com.jdojo.mrjar.jdk10\build\classes .

報出的警告信息為:

Warning: entry META-INF/versions/9/com/jdojo/mrjar/Main.class contains a class that

is identical to an entry already in the jar

Warning: entry META-INF/versions/9/com/jdojo/mrjar/TimeUtil.class contains a class that

is identical to an entry already in the jar

1. 多版本JAR和JAR URL

在MRJAR之前,JAR中的所有資源都存在于根目錄中。 當從類加載器(ClassLoader.getResource(“com/jdojo /mrjar/TimeUtil.class”))請求資源時,返回的URL類似于以下內容:

jar:file:/C:/Java9Revealed/mrjars/com.jdojo.mrjar.jar! com/jdojo/mrjar/TimeUtil.class

With MRJARs, a resource may be returned from the root directory or from a versioned directory. If you are looking for the TimeUtil.class file on JDK 9, the URL will be as follows:

jar:file:/C:/Java9Revealed/mrjars/com.jdojo.mrjar.jar!/META-INF/versions/9/com/jdojo/mrjar/TimeUtil.class

如果你現有的代碼期望特定格式的資源的jar文件的URL,或者手工編寫了了一個URL,當與MRJAR一起工作時,可能會獲得意想不到的結果。如果正在使用MRJAR重新打包JAR,則需要再次查看代碼并將其更改,能夠在MRJAR下工作。

2. 多版本Manifest屬性

MRJAR在其MANIFEST.MF文件中包含一個特殊屬性:

Multi-Release: true

Multi-Release屬性在使用jar工具創建MRJAR時添加。 如果此屬性的值為true,則表示JAR是多版本JAR。 如果其值為false或屬性缺失,則不是多版本JAR。

名為MULTI_RELEASE的新常量已添加到Attributes.Name類(位于java.util.jar包中),以表示manifest 文件中的新屬性Multi-Release。 因此,Attributes.Name.MULTI_RELEASE常量表示Java代碼中Multi-Release屬性的值。

六. JMOD格式

JDK 9引入了一種稱為JMOD的新格式來封裝模塊。 JMOD文件旨在處理比JAR文件更多的內容類型。 JMOD文件可以打包本地代碼,配置文件,本地命令和其他類型的數據。 目前,JMOD格式基于ZIP格式,將在將來會發生變化。 JDK 9模塊以JMOD格式打包,可以在編譯時和鏈接時使用。 運行時不支持JMOD格式。 可以在JDK_HOME\jmods目錄中找到它們,其中JDK_HOME是安裝JDK 9的目錄。可以使用JMOD格式打包自己的模塊。 JMOD格式的文件具有.jmod擴展名。 例如,名為java.base的平臺模塊已打包在java.base.jmod文件中。

JMOD文件可以包含本地代碼,這在運行時提取和鏈接有點棘手。 這就是為什么JMOD文件在編譯時和鏈接時都被支持,運行時卻不可以。

1. 使用jmod工具

JDK 9附帶了一個名為jmod的新工具。 它位于JDK_HOME\bin目錄中。 它可以用于創建一個JMOD文件,列出一個JMOD文件的內容,打印一個模塊的描述,并記錄使用的模塊的哈希值。 使用jmod工具的一般語法如下:

jmod

其中在jmod命令中至少包含以下一個子命令:

create

extract

list

describe

hash

list和describe子命令不接受任何選項。 是要創建的JMOD文件或要描述的現有JMOD文件。 下面包含該工具支持的選項列表。

選項 | 描述

-- | -- | --

--class-path | 指定可以找到要打包的類的類路徑。 可以是包含應用程序類的JAR文件或目錄的路徑列表。中的內容將被復制到JMOD文件。

--cmds | 指定包含本地命令的目錄列表,這些目錄需要復制到JMOD文件中。

--config | 指定包含要復制到JMOD文件的用戶可編輯配置文件的目錄列表。

--dir | 指定提取指定的JMOD文件的內容的目標目錄。

--do-not-resolve-by-default | 如果使用此選項創建JMOD文件,JMOD文件中包含的模塊將從默認的根模塊中排除。 要解決此類模塊,必須使用 --add-modules命令行選項將其添加到默認的根模塊中。

--dry-run | 模塊的哈希值。 使用此選項可以計算和打印哈希值,但不將它們記錄在JMOD文件中。

--exclude | 排除與提供的逗號分隔模式列表匹配的文件,每個元素使用以下格式之一:,glob:,或 regex:。

--hash-modules | 計算和記錄哈希值,以將打包的模塊與符合給定的的模塊進行綁定,并直接或間接依賴于它。 在正在創建的JMOD文件中記錄哈希值,或者在使用jmod哈希命令指定的模塊路徑上的JMOD文件或模塊化JAR。

--help, -h | 打印使用說明和jmod命令的所有選項列表。

--header-files | 將路徑列表指定為,將要復制到JMOD文件的本機代碼的頭文件放置于此。

--help-extra | 打印jmod工具支持的其他選項的幫助信息。

--legal-notices | 指定要復制到JMOD文件的合法聲明的位置。

--libs | 指定包含要復制到JMOD文件的本地類庫的目錄列表。

--main-class | 指定要用于運行應用程序的主類名稱。

--man-pages | 指定手冊主頁的位置。

--module-version | 指定要記錄在module-info.class文件中的模塊版本。

--module-path , -p | 指定找到散列模塊的模塊路徑。

--os-arch | 指定要記錄在module-info.class文件中的操作系統體系結構。

--os-name | 指定要記錄在module-info.class文件中的操作系統名稱。

--version | 打印jmod 工具的版本。

--warn-if-resolved | 指定一個jmod工具的提示,如果一個模塊被解決,發出一個警告。的值可能是三種: deprecated, deprecated-for-remova, 或incubating。

@ | 從指定的文件中讀取選項。

以下部分將詳細介紹如何使用jmod命令。 本章中使用的所有命令均輸入一行。 有時候,為了顯示更加清晰,將它們顯示在多行上。

七. 創建JMOD文件

你可以使用jmod工具命令的子命令create來創建一個jmod文件。一個jmod文件的內容是一個模塊的內容。假設下列目錄和文件已經存在:

C:\Java9Revealed\jmods

C:\Java9Revealed\lib\com.jdojo.prime.jar

以下命令在C:\ Java9Revealed\jmods目錄中創建一個com.jdojo.prime.jmod文件。 JMOD文件的內容來自com.jdojo.prime.jar文件。

C:\Java9Revealed>jmod create --class-path lib\com.jdojo.prime.jar

jmods\com.jdojo.prime.jmod

通常,JMOD文件的內容來自包含模塊編譯代碼的一系列目錄。 以下命令創建一個com.jdojo.prime.jmod文件。它的內容來自一個mods\com.jdojo.prime目錄。 該命令使用--module-version選項來設置將記錄在com.jdojo.prime\build\classes目錄中的module-info.class文件中的模塊版本。 確保刪除在上一步中創建的JMOD文件。

C:\Java9Revealed>jmod create --module-version 1.0

--class-path com.jdojo.prime\build\classes jmods\com.jdojo.prime.jmod

你可以用這個JMOD文件做什么? 可以將其放在模塊路徑上,以便在編譯時使用它。 可以使用它與jlink工具來創建可用于運行應用程序的自定義運行時映像。 回想一下,你不能在運行時使用它。 如果嘗試在運行時使用JMOD文件放在模塊路徑上,將收到以下錯誤:

Error occurred during initialization of VM

java.lang.module.ResolutionException: JMOD files not supported: jmods\com.jdojo.prime.jmod

八. 提取JMOD文件內容

可以使用extract子命令提取JMOD文件的內容。 以下命令將jmods\com.jdojo.prime.jmod文件的內容提取到名為extract的目錄中。

C:\Java9Revealed>jmod extract --dir extracted jmods\com.jdojo.prime.jmod

如果沒有--dir選項,則JMOD文件的內容直接提取到當前目錄下。

九. 列出JMOD文件內容

可以使用list子命令與jmod工具打印JMOD文件中所有條目的名稱。 以下命令列出了在上一節中創建的com.jdojo.prime.jmod文件的內容:

C:\Java9Revealed>jmod list jmods\com.jdojo.prime.jmod

以下命令列出了java.base.jmod的JMOD文件發布的java.base模塊的內容。 該命令假設已經在C:\java9目錄中安裝了JDK 9。 輸出超過120頁。 下面顯示的是部分輸出。 請注意,JMOD文件內部將不同類型的內容存儲在不同的目錄中。

C:\Java9Revealed>jmod list C:\java9\jmods\java.base.jmod

輸出結果為(部分內容):

classes/module-info.class

classes/java/nio/file/WatchEvent.class

classes/java/nio/file/WatchKey.class

bin/java.exe

bin/javaw.exe

native/amd64/jvm.cfg

native/java.dll

conf/net.properties

conf/security/java.policy

conf/security/java.security

...

十. 描述一個JMOD文件

可以使用describe子命令與jmod工具來描述JMOD文件中包含的模塊。 以下命令描述com.jdojo.prime.jmod文件中包含的模塊:

C:\Java9Revealed>jmod describe jmods\com.jdojo.prime.jmod

輸出結果為:

com.jdojo.prime@1.0

requires mandated java.base

uses com.jdojo.prime.PrimeChecker

exports com.jdojo.prime

可以使用此命令來描述平臺模塊。 以下命令描述了java.sql.jmod中包含的模塊,假設已在C:\java9目錄中安裝了JDK 9:

C:\Java9Revealed>jmod describe C:\java9\jmods\java.sql.jmod

java.sql@9-ea

輸出結果為:

requires mandated java.base

requires transitive java.logging

requires transitive java.xml

uses java.sql.Driver

exports java.sql

exports javax.sql

exports javax.transaction.xa

operating-system-name Windows

operating-system-architecture amd64

十一. 記錄模塊哈希值

可以使用jmod工具的hash子命令記錄其他模塊的哈希值,包含在一個jmod文件模塊的module-info.class文件中。哈希值將用于以后的依賴性驗證。假設你在四個jmod文件中有四個模塊:

com.jdojo.prime

com.jdojo.prime.generic

com.jdojo.prime.faster

com.jdojo.prime.client

假設希望將這些模塊提供給給客戶,并確保模塊代碼保持不變。可以通過為這四個模塊記錄哈希值來實現。讓我們看看如何做到這一點。

如果要計算其他模塊的哈希值,首先jmod能夠找到這些模塊。 你需要使用--module-path選項在模塊路徑中,以便找到其他模塊。 同時,也需要使用--hash-modules選項來指定要使用的哈希值記錄模塊的模式列表。

Tips

當你把一個模塊打包成一個JAR格式時,可以在jar命令中使用--hash-modules 和 --module-path來記錄依賴模塊的哈希值。

使用以下四個命令為四個模塊創建jmod文件。在創建com.jdojo.prime.client.jmod時使用了--main-class選項。 如果在運行這些命令時,給你一個“file already exists”的錯誤,從jmods目錄刪除現有的jmod文件并重新運行命令。

C:\Java9Revealed>jmod create --module-version 1.0

--class-path com.jdojo.prime\build\classes jmods\com.jdojo.prime.jmod

C:\Java9Revealed>jmod create --module-version 1.0

--class-path com.jdojo.prime.generic\build\classes

jmods\com.jdojo.prime.generic.jmod

C:\Java9Revealed>jmod create --module-version 1.0

--class-path com.jdojo.prime.faster\build\classes

jmods\com.jdojo.prime.faster.jmod

C:\Java9Revealed>jmod create --main-class com.jdojo.prime.client.Main

--module-version 1.0

--class-path com.jdojo.prime.client\build\classes

jmods\com.jdojo.prime.client.jmod

現在你準備好記錄名字以com.jdojo.prime的模塊的哈希值。在com.jdojo.prime模塊中使用下面的命令:

C:\Java9Revealed>jmod hash --module-path jmods

--hash-modules com.jdojo.prime.? jmods\com.jdojo.prime.jmod

讓我們看看記錄在com.jdojo.prime模塊的哈希值。下面命令打印記錄有哈希值的模塊描述:

C:\Java9Revealed>jmod describe jmods\com.jdojo.prime.jmod

輸出結果為:

com.jdojo.prime@1.0

requires mandated java.base

uses com.jdojo.prime.PrimeChecker

exports com.jdojo.prime

hashes com.jdojo.prime.client SHA-256 2ffb0d4413501e389d6712450bd138bbe82ca8abeb4e8b5d29b0c307d90a2e91

hashes com.jdojo.prime.faster SHA-256 687e07c429080c48bed89a649dca20fa26dc28fab88a4905f1b5070560622a0c

hashes com.jdojo.prime.generic SHA-256 f24556ef69c4345ad7a8e5e59d31ea2d52c8749714ede0c0dedf128255450708

當你使用create子命令創建一個新的jmod文件時,也可以記錄其他模塊的哈希值。假設三個模塊com.jdojo.prime.generic,com.jdojo.prime.faster,和com.jdojo.prime.client存在于模塊的路徑,你可以使用下面的命令來創建com.jdojo.prime.jmod文件同時也記錄了其他三個模塊的哈希值:

C:\Java9Revealed>jmod create --module-version 1.0

--module-path jmods

--hash-modules com.jdojo.prime.?

--class-path com.jdojo.prime\build\classes jmods\com.jdojo.prime.jmod

可以使用--dry-run選項運行哈希過程的JMOD文件,其中將打印哈希值,但不會記錄。 此選項有助于確保所有設置是正確的,而無需創建JMOD文件。 以下的命令順序將會引導你完成整個過程。 首先,刪除在上一步中創建的jmods\com.jdojo.prime.jmod文件。

以下命令創建jmods\com.jdojo.prime.jmod文件,而不會為其他模塊記錄哈希值:

C:\Java9Revealed>jmod create --module-version 1.0

--module-path jmods

--class-path com.jdojo.prime\build\classes jmods\com.jdojo.prime.jmod

以下命令運行hash --dry-run子命令。 它計算并打印其他模塊的哈希值,與--hash-modules選項中指定的正則表達式匹配。 jmods\com.jdojo.prime.jmod文件中不會記錄哈希值。

C:\Java9Revealed>jmod hash --dry-run --module-path jmods

--hash-modules com.jdojo.prime.? jmods\com.jdojo.prime.jmod

輸出結果為:

Dry run:

com.jdojo.prime

hashes com.jdojo.prime.client SHA-256 2ffb0d4413501e389d6712450bd138bbe82ca8abeb4e8b5d29b0c307d90a2e91

hashes com.jdojo.prime.faster SHA-256 687e07c429080c48bed89a649dca20fa26dc28fab88a4905f1b5070560622a0c

hashes com.jdojo.prime.generic SHA-256 f24556ef69c4345ad7a8e5e59d31ea2d52c8749714ede0c0dedf128255450708

以下命令驗證上一個命令在JMOD文件中沒有記錄哈任何希值:

C:\Java9Revealed>jmod describe jmods\com.jdojo.prime.jmod

輸出結果為:

com.jdojo.prime@1.0

requires mandated java.base

uses com.jdojo.prime.PrimeChecker

exports com.jdojo.prime

十二. 總結

JDK 9支持四種格式來打包模塊:展開的目錄,JAR文件,JMOD文件和JIMAGE文件。 JAR格式在JDK 9中得到了增強,以支持模塊化JAR和多版本JAR。多版本JAR允許你打包相同版本的類庫或面向JDK不同版本的應用程序。例如,多版本JAR可能包含包含JDK 8和JDK 9代碼的庫版本為1.2的代碼。當在JDK 8上使用多版本JAR時,將使用JDK 8版本的庫代碼。當它在JDK 9上使用時,將使用JDK 9版本的庫代碼。特定于JDK版本N的文件存儲在多版本JAR的META-INF\versions\N目錄中。所有JDK版本通用的文件都存儲在根目錄中。對于不支持多版本JAR的環境,此類JAR將被視為常規JAR。在多版本JAR中,文件的搜索順序是不同的,所有從當前平臺的主版本開始的所有版本化目錄都在根目錄之前進行搜索。

JMOD文件旨在處理比JAR文件更多的內容類型。它們可以打包本地代碼,配置文件,本地命令和其他類型的數據。目前,JMOD格式基于ZIP格式,將在將來會發生變化。 JDK 9模塊以JMOD格式打包,可以在編譯時和鏈接時使用。運行時不支持JMOD格式。可以使用jmod工具來處理JMOD文件。

總結

以上是生活随笔為你收集整理的java模块是什么6_Java 9 揭秘(6. 封装模块)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

九九视频免费 | 中文字幕综合在线 | a特级毛片 | 日韩激情精品 | 国产精品毛片一区二区三区 | 中文字幕色综合网 | 欧美日韩视频在线观看免费 | 国产一区免费视频 | 国产精品麻豆一区二区三区 | 中文超碰字幕 | 美女久久视频 | 美女视频免费精品 | 国产精品日韩欧美 | 国产人成免费视频 | 99成人在线视频 | 国产成人精品亚洲 | 成人午夜电影网站 | 国产99免费视频 | 日韩欧美高清一区二区三区 | 精品国产视频一区 | www..com毛片 | 又色又爽的网站 | 在线 国产一区 | 亚洲综合欧美日韩狠狠色 | 国产精品四虎 | 欧美国产日韩在线观看 | 欧美日韩视频在线 | 精品国产网址 | 欧美一区二区伦理片 | 亚洲欧洲日韩 | 国产成人精品一区在线 | a√天堂资源 | 国产成人av免费在线观看 | 日韩精品专区 | 欧美在线1 | 美女免费视频一区 | 欧美精彩视频在线观看 | 伊人资源站 | 九色激情网 | 午夜视频在线观看网站 | 亚洲成人一区 | 国产美女在线精品免费观看 | 国内外成人在线 | 亚洲综合成人av | 99 久久久久| 日韩激情视频在线 | 亚洲免费色 | 99精品亚洲 | 粉嫩高清一区二区三区 | 午夜三级福利 | 九九九热| 毛片基地黄久久久久久天堂 | 日日弄天天弄美女bbbb | 一级α片 | 96久久欧美麻豆网站 | 日韩激情第一页 | 日日夜夜艹| 97看片| 免费观看丰满少妇做爰 | 日韩国产精品久久久久久亚洲 | 狠狠躁夜夜a产精品视频 | 伊香蕉大综综综合久久啪 | 国产成人精品一区二区三区在线 | 免费在线观看不卡av | 久草在线免费资源 | 日本久久久久久 | 日韩在线免费小视频 | 人人狠狠综合久久亚洲婷 | 免费亚洲片 | 日韩精品免费一区二区三区 | 欧美午夜寂寞影院 | 国产精品区二区三区日本 | 韩日色视频 | 欧美a级成人淫片免费看 | 中文字幕一区二区在线观看 | 国产九九九九九 | 九九色综合| 97在线观看免费观看高清 | 在线观看免费成人 | 丁香五月亚洲综合在线 | 欧美 日韩 国产 中文字幕 | 欧洲精品码一区二区三区免费看 | 91污视频在线观看 | 在线免费中文字幕 | 免费精品视频在线 | 免费看片成人 | 韩日精品中文字幕 | 男女啪啪视屏 | 91九色视频在线观看 | 中文资源在线播放 | 亚洲精选久久 | 久久久 精品 | 久久av中文字幕片 | 在线视频免费观看 | 人人爽人人爽人人片av免 | 国产伦精品一区二区三区免费 | 91精品久久久久久 | 国产一区福利 | 97人人爽人人 | 国产日韩欧美视频在线观看 | 久久精品免费电影 | 九九久久视频 | 91| 国产视频在线观看一区 | 4p变态网欧美系列 | 91看片看淫黄大片 | 亚洲成人黄色在线 | 高清av免费看 | 中文字幕在线观看完整版 | 人人澡人人添人人爽一区二区 | a级国产乱理论片在线观看 特级毛片在线观看 | 国产伦理剧 | 九九热精品国产 | av电影在线不卡 | 久久不卡国产精品一区二区 | 国产精品久久久久久久久久久免费看 | 国产精品一区一区三区 | 日韩av视屏 | 亚洲五月六月 | 国产精品麻豆99久久久久久 | 日韩三级视频在线观看 | 亚洲黄色免费在线 | 日韩在线视频播放 | 在线看一区二区 | 亚洲精品国产精品国自 | 成人综合婷婷国产精品久久免费 | 日韩午夜一级片 | 成人av直播 | 五月天激情综合 | 超碰在线人 | 国产精品久久久久久超碰 | 在线黄网站 | 成人av电影免费 | 亚洲一区久久久 | 97超视频 | 国产中文字幕网 | www.精选视频.com | 五月天综合| 视频国产 | 五月天久久综合网 | 久久成人久久 | 91大神精品视频在线观看 | 亚洲日韩精品欧美一区二区 | 亚洲女裸体 | 色天天天| 久久国产热视频 | 免费国产亚洲视频 | 五月天亚洲综合小说网 | 免费成人在线观看视频 | 香蕉网在线观看 | 色99视频| 高清av中文在线字幕观看1 | 亚洲欧美国产日韩在线观看 | 91在线国产观看 | 久久精品免费 | 国产在线成人 | 麻豆精品视频在线观看免费 | 欧美最猛性xxxxx免费 | 欧美福利久久 | 网站免费黄 | 欧美日韩精品在线视频 | 福利电影久久 | 欧美日韩电影在线播放 | 黄色特级毛片 | 久久影院一区 | 超碰成人免费电影 | 奇米7777狠狠狠琪琪视频 | 激情综合电影网 | 99久久国产免费,99久久国产免费大片 | 成年人在线观看视频免费 | 蜜臀av免费一区二区三区 | 日韩av成人在线观看 | 黄色免费看片网站 | 国产精品ⅴa有声小说 | 天天天干天天射天天天操 | 亚洲国产伊人 | 日韩久久久久久久久 | 国产一级精品绿帽视频 | 欧美综合色在线图区 | 国产精品免费观看久久 | 天天色.com | 国产高清成人av | 久久伊人精品天天 | 国产精品久久久久久久久久久久午夜 | 久久久国际精品 | 久久99最新地址 | 成人在线观看日韩 | 手机在线小视频 | 香蕉视频网站在线观看 | 欧美激情视频一区二区三区免费 | 亚洲欧洲精品在线 | 亚洲日本一区二区在线 | 伊人国产女 | 欧美日韩电影在线播放 | 91高清在线看 | 免费视频18| 黄色成人在线网站 | 亚洲电影一区二区 | 亚洲无人区小视频 | 久久丁香网 | 免费一级片久久 | 黄色a级片在线观看 | 成人午夜免费福利 | 国产精品完整版 | 岛国av在线| 国产视频一区精品 | 99视频 | 97成人精品 | 日韩免费看视频 | 色a在线观看 | 亚洲国产精品99久久久久久久久 | 久久69av| 久草在线免费在线观看 | 亚洲欧美视频一区二区三区 | 手机成人av在线 | 国产小视频在线看 | 香蕉国产91 | 免费一级特黄毛大片 | 久久高清免费观看 | 久草在线资源观看 | 亚洲精选在线观看 | 国产精品九九视频 | 91在线观看视频 | 91在线永久 | 99色在线观看视频 | 91完整版| 青青草久草在线 | 91漂亮少妇露脸在线播放 | 99视频在线观看一区三区 | 高清不卡免费视频 | 国产精品欧美久久久久三级 | 国产久草在线观看 | 狠狠艹夜夜干 | 久久综合国产伦精品免费 | 欧美成人精品欧美一级乱黄 | 中文字幕日韩在线播放 | japanesexxx乱女另类 | 中文字幕视频网 | 欧美精品免费一区二区 | 精品无人国产偷自产在线 | 一区二区三区免费 | 免费av在线网 | 国产淫a | 亚洲精品乱码久久久久久写真 | av在线影视| 国产99久久久国产精品成人免费 | 91丨九色丨蝌蚪丰满 | 成人小视频在线免费观看 | 超碰97网站| 不卡视频一区二区三区 | 在线高清av | 国产在线一区二区三区播放 | 国产在线播放一区 | 日韩欧美综合在线视频 | 欧美午夜理伦三级在线观看 | 久久久久久久免费看 | 久久婷婷一区二区三区 | 激情中文在线 | 69视频国产 | 高清av免费一区中文字幕 | 天堂网一区 | 国产精品欧美久久久久三级 | 91av网址 | 亚洲国产一二三 | 在线国产黄色 | av视屏在线播放 | 久久午夜鲁丝片 | 六月婷婷久香在线视频 | 欧美精品黑人性xxxx | 超碰成人免费电影 | av黄色在线播放 | 欧美999| 激情网站 | 怡红院av久久久久久久 | 综合久久五月天 | 久久96国产精品久久99软件 | 成人丝袜| 亚洲欧美国产精品 | 色综合久久88色综合天天人守婷 | 免费看日韩片 | 女人18片| 在线免费观看国产黄色 | 人人网av| 天天人人综合 | 日韩欧美高清视频在线观看 | 中文字幕免费看 | 又黄又刺激又爽的视频 | 国产91精品一区二区 | 国产手机视频在线播放 | 日韩精品免费在线 | 高潮毛片无遮挡高清免费 | 亚洲国产99 | 国产精品久久久久久久久久久久 | 日本成址在线观看 | 人人射人人澡 | 91天天视频 | av电影免费看 | 亚洲狠狠婷婷综合久久久 | 久久国产成人午夜av影院潦草 | 制服丝袜亚洲 | 国产毛片久久久 | 久久久久久久18 | 日韩天堂网 | 午夜.dj高清免费观看视频 | 精精国产xxxx视频在线播放 | 一区二区三区精品久久久 | 成人av视屏 | 2019中文最近的2019中文在线 | 99久久久国产精品免费99 | 免费下载高清毛片 | www.色爱| av高清一区二区三区 | 区一区二区三在线观看 | 91精品在线免费观看视频 | 精品国精品自拍自在线 | 亚洲a资源| 五月天精品视频 | 午夜视频亚洲 | 欧美aⅴ在线观看 | www.五月婷婷.com | 久久精品欧美日韩精品 | 国产高清视频在线 | 毛片网站观看 | 久草在线最新视频 | 中文字幕二区在线观看 | 97视频资源| av成人亚洲| 在线观看午夜av | 日本在线观看一区二区 | 91免费试看 | 亚洲va综合va国产va中文 | 国产精品 欧美 日韩 | 91麻豆福利 | 五月激情视频 | 在线成人免费电影 | 久久精品国产第一区二区三区 | 国产精品成人av电影 | 国内精品久久久 | 亚洲a色 | 久久五月婷婷综合 | 久久精品视频在线免费观看 | 久久黄色免费观看 | 亚洲美女免费精品视频在线观看 | 欧洲色吧 | 永久免费的av电影 | 亚洲 欧洲 国产 精品 | 欧洲精品码一区二区三区免费看 | 黄色成品视频 | 新版资源中文在线观看 | 久久免费a | 五月天丁香综合 | 日韩首页| 欧美在一区 | 天天干天天弄 | 成年人免费在线看 | a黄色| 在线免费观看黄色 | 日韩电影一区二区三区在线观看 | 丁香六月综合网 | 狠狠干夜夜操 | 伊人午夜 | 国产一区二区视频在线播放 | 国产精品国产三级国产aⅴ入口 | 色天天 | 男女精品久久 | 国产乱视频 | 五月婷婷电影网 | 中文字幕国产一区 | 免费 在线 中文 日本 | 国产精品成久久久久三级 | 久久成熟| 成人在线视频免费看 | 日韩av专区| 久久综合九色99 | 国产高清免费在线播放 | 亚洲天堂网在线观看视频 | 视频三区在线 | 久久伊人八月婷婷综合激情 | 亚洲黄色高清 | 人人澡人摸人人添学生av | a级国产乱理伦片在线观看 亚洲3级 | 国产一区二区在线视频观看 | 天天干天天怕 | 精品国产亚洲一区二区麻豆 | 国产精品综合在线 | 久久国产手机看片 | 五月婷婷.com| 中文字幕久久精品亚洲乱码 | 亚洲高清在线视频 | 夜夜摸夜夜爽 | 99久久99久久精品国产片果冰 | 五月天中文字幕mv在线 | 国内精品久久久久久久影视简单 | 久久久精品一区二区 | 国产亚洲精品久久网站 | 天天干天天玩天天操 | 99色视频在线 | 成人在线黄色 | 日日干天天操 | 国产免费不卡av | 91你懂的| 一级成人免费 | 国产淫a| 亚洲理论影院 | 久久福利| 日韩视频中文字幕 | 色视频在线免费观看 | 欧美日韩久久 | 99久热精品 | 国产亚洲精品久久久久久移动网络 | 视频在线观看91 | 日本中文字幕电影在线免费观看 | 激情综合啪 | 美女久久视频 | 亚洲一级片在线看 | 最新中文字幕在线播放 | 日本不卡一区二区 | 欧美日一级片 | 日韩高清在线一区二区三区 | 国产精品麻豆三级一区视频 | 中文字幕在线观看1 | 亚洲精品国产成人 | 99热这里只有精品免费 | 伊人天天色| 日本久久免费电影 | 免费高清在线观看电视网站 | 在线视频观看亚洲 | 青青射 | 国产成人高清 | 亚洲精品免费在线观看 | 久草免费在线观看视频 | 九月婷婷色 | 天天干天天想 | 久久久国产精品久久久 | 免费在线观看国产精品 | 在线色亚洲 | 嫩小bbbb摸bbb摸bbb | 成片视频免费观看 | 人人澡超碰碰97碰碰碰软件 | 99精品国产高清在线观看 | 激情五月婷婷丁香 | 久久超碰网 | 国产精品久久久久久久久久99 | 久久久久久亚洲精品 | av在线收看| 在线观看岛国片 | 国产精品女主播一区二区三区 | 亚洲欧美视频在线 | 欧美日韩国产在线精品 | 伊人婷婷激情 | 91精选在线 | 99精品区| 手机成人在线 | 亚洲春色综合另类校园电影 | 丁香婷婷色综合亚洲电影 | 中文字幕在线免费97 | 久热电影 | 久久久免费看片 | 国产免费xvideos视频入口 | 97电影网手机版 | 精久久久久| 亚洲第二色 | 天天做综合网 | 99re国产视频 | 久操视频在线免费看 | 九色免费视频 | 91香蕉视频在线下载 | 视频精品一区二区三区 | 国产在线观看网站 | 91精品国产自产在线观看永久 | 久久大香线蕉app | 中文字幕精品视频 | 激情网婷婷 | 日韩av免费大片 | 在线免费日韩 | 黄色特级毛片 | 国产美女精品视频免费观看 | 日韩精品一区二区三区在线视频 | 精品视频久久久 | 久久www免费人成看片高清 | 欧美日韩在线视频观看 | 最近日韩免费视频 | 五月婷婷中文网 | 国产亚洲一区二区三区 | 欧美 日韩 性 | 婷婷色综合网 | 日日干激情五月 | 婷婷色网| 日韩黄色一级电影 | 亚洲精品在线资源 | 午夜视频在线观看一区二区三区 | 激情综合色综合久久 | 日韩色高清 | 在线中文字幕网站 | 日韩久久在线 | 最新超碰| 天天射综合网视频 | 国产亚洲激情视频在线 | 夜色资源站wwwcom | 国产在线97 | 区一区二在线 | 免费看91的网站 | 美女精品久久久 | 人人揉人人揉人人揉人人揉97 | 久久久免费毛片 | 欧美亚洲国产精品久久高清浪潮 | www..com毛片 | 精品一区二区在线免费观看 | 久久激情影院 | 国产一级视频在线免费观看 | 久久免费公开视频 | 国产明星视频三级a三级点| 国产色影院| 人人插人人舔 | 操操操人人| 久久夜色网 | 91网址在线 | 久久久精品免费观看 | 欧美日韩高清在线 | 黄色电影网站在线观看 | 在线播放日韩av | 日韩精品中文字幕有码 | 成人91免费视频 | 国产精品入口麻豆 | 在线观看一区二区视频 | 草久久影院 | 欧美一级激情 | 操操操日日| 亚洲激情p | 国产免费一区二区三区最新6 | 月下香电影 | 91av美女| 国产手机视频精品 | 精品国产精品久久一区免费式 | 国产福利精品在线观看 | av一级片网站 | 久久99亚洲网美利坚合众国 | 色婷婷狠狠五月综合天色拍 | 一区二区三区四区在线免费观看 | 一区二区三区免费播放 | 亚洲自拍偷拍色图 | 成人三级视频 | 国产精品一区二 | 中文字幕av一区二区三区四区 | 日韩网页 | 久久婷婷一区二区三区 | 亚洲精品www久久久久久 | 91精品国产综合久久福利不卡 | 色噜噜噜噜 | .国产精品成人自产拍在线观看6 | 81国产精品久久久久久久久久 | 欧美性生活一级片 | 国产短视频在线播放 | 天天综合网 天天综合色 | av在线免费观看网站 | 国产小视频91 | 亚洲综合欧美日韩狠狠色 | 色的网站在线观看 | 亚洲欧美综合 | 国产中文字幕久久 | 午夜影院三级 | 午夜性色| 中文字幕亚洲五码 | 日韩久久精品 | 国产精品成人a免费观看 | 在线小视频你懂得 | 91av手机在线 | 免费亚洲精品 | 麻豆系列在线观看 | 91免费网站在线观看 | 伊人中文网 | 天天干,天天操 | 国产精品美女毛片真酒店 | 黄色a级片在线观看 | 久久精品99国产精品日本 | 日日夜夜精品视频天天综合网 | 日韩精品第一区 | 蜜臀久久99精品久久久无需会员 | 最近免费在线观看 | 插综合网| 视频在线精品 | 99久久精品免费看国产一区二区三区 | 亚洲欧美观看 | 欧美日韩在线观看视频 | 夜夜干天天操 | 18久久久久 | 久久96国产精品久久99软件 | 亚洲激情综合 | 久草网免费 | 成人av午夜| 久久精品在线视频 | 日韩免费中文字幕 | 99精品亚洲| 黄色高清视频在线观看 | 免费在线观看一区二区三区 | 国产又粗又硬又爽的视频 | 丁香狠狠| 婷婷干五月 | 一本一本久久aa综合精品 | 精品一区二区三区久久久 | 在线观看中文字幕一区 | 国产福利91精品 | 日日干日日操 | 国产精品久久三 | 日本在线观看一区 | 91在线视频 | 国产精品九九视频 | 亚州av成人 | 27xxoo无遮挡动态视频 | 人人插人人干 | 十八岁以下禁止观看的1000个网站 | 亚洲综合在线五月天 | av日韩国产| 久久精品之 | 在线精品视频在线观看高清 | 亚洲国产精品免费 | 久久人人爽| 香蕉视频导航 | 久久99久久精品国产 | 97超级碰碰碰视频在线观看 | 在线观看成人小视频 | 国产日本在线 | 国产美女精品视频免费观看 | 九九99| 一级理论片在线观看 | 亚洲精品在线观看视频 | 中文在线√天堂 | 丁香久久 | 免费观看91 | 四虎在线观看 | 国精产品999国精产 久久久久 | 99在线精品视频在线观看 | 人人爽久久久噜噜噜电影 | 日韩欧美视频一区 | www国产亚洲精品 | 午夜久操 | 不卡的一区二区三区 | 91精品视频免费在线观看 | 日韩av免费一区二区 | 91少妇精拍在线播放 | 天天操天天透 | 久久久久免费网 | 超薄丝袜一二三区 | 国产成人区 | 天天摸天天干天天操天天射 | 成年美女黄网站色大片免费看 | 中文字幕免费高清在线 | 久久国产精品一国产精品 | 日韩高清免费电影 | 日本爱爱片 | 精品久操 | 欧美另类69 | 国产经典三级 | 在线欧美日韩 | 成人动漫精品一区二区 | 久久99亚洲精品久久 | 久久99国产综合精品免费 | 久精品视频在线观看 | 国产传媒一区在线 | www.午夜色.com | 久久伦理电影网 | 69欧美视频| 国产精品久久久久久久99 | 97超碰在线久草超碰在线观看 | 高清一区二区 | 美女网站免费福利视频 | 久久99精品久久久久久久久久久久 | 91探花系列在线播放 | 免费看成人av | 久久婷婷国产色一区二区三区 | 国产69精品久久久久久久久久 | 色多视频在线观看 | 天天干国产 | 人人添人人澡 | 亚洲电影一级黄 | www.69xx | 亚洲天堂网在线视频观看 | 男女靠逼app| 人人藻人人澡人人爽 | 日韩综合一区二区 | 精品久久视频 | 27xxoo无遮挡动态视频 | 亚洲精品午夜视频 | 丝袜美腿在线 | 亚洲精品色婷婷 | 天天射综合网视频 | 久久久久国产精品午夜一区 | 激情 婷婷| 黄色a在线 | 91丨九色丨蝌蚪丨对白 | 久久久午夜剧场 | 中文字幕久久精品 | 国产一区二区三区视频在线 | 伊人天天狠天天添日日拍 | 国产999久久久 | 久久久久 免费视频 | 美女又爽又黄 | 国产一区在线观看免费 | 久久黄色影视 | 久久9999久久| 97在线观看视频 | 岛国精品一区二区 | 国产一区二区免费 | 探花在线观看 | 欧美激情精品久久久久 | 久久99国产精品久久99 | 精品影院 | 成人国产精品久久久久久亚洲 | 国产精品一区二区免费看 | 国产91九色视频 | 五月天婷亚洲天综合网精品偷 | 国产黄大片| 日本一区二区高清不卡 | 成人一级视频在线观看 | 中文字幕日韩无 | 精品二区视频 | 亚洲最新av在线 | 免费成人在线电影 | 久久精品麻豆 | 日韩动态视频 | 97超碰在线久草超碰在线观看 | 亚洲砖区区免费 | 国产一区影院 | 成人宗合网| 国产精品久久久久久超碰 | 国产二区电影 | www.五月天激情 | av在线免费播放网站 | 91精品视频免费看 | 激情久久小说 | 国产视频精品久久 | 天天操天天能 | 久久一区二 | 久久视频这里有精品 | 久久精品国产第一区二区三区 | 国产精品18久久久久久久久 | 日韩在线免费 | 五月婷婷在线综合 | 国产一级免费av | 激情深爱.com | www麻豆视频 | 日韩经典一区二区三区 | 久久久久国产精品www | 成人视屏免费看 | 色综合久久五月 | 日韩精品免费一区二区在线观看 | 日日爽天天操 | a视频在线 | 国产一区免费 | 天天爱天天爽 | 亚洲在线精品视频 | 久久亚洲电影 | 国产一卡二卡在线 | av久久在线 | 国产欧美中文字幕 | 国产黄大片| 美女网站视频久久 | 成年人免费在线 | 狠狠伊人 | 亚洲第一区在线播放 | 亚洲免费av电影 | 日韩免费高清 | 亚洲成av人片在线观看无 | 欧美在线视频a | 天天拍天天爽 | 国产人成看黄久久久久久久久 | 香蕉视频日本 | 欧美精选一区二区三区 | 91黄视频在线 | 国产成人免费在线 | 欧美精品亚洲精品日韩精品 | 国产裸体无遮挡 | 久久精品女人毛片国产 | 久久国产精品二国产精品中国洋人 | 国产高清区 | 99视频免费看| 丰满少妇麻豆av | 婷婷在线播放 | 成人久久久久久久久久 | 日韩免费视频观看 | 久久久免费看视频 | 五月婷婷视频 | 日韩美女高潮 | 日本中文字幕网站 | 国产999视频 | av在线a | 国产一级电影在线 | 九九精品无码 | 欧美日韩裸体免费视频 | av免费在线播放 | 久久综合爱 | 五月婷婷播播 | 色婷婷激情综合 | 日本中文字幕视频 | 亚洲国产偷 | 91精选| 激情偷乱人伦小说视频在线观看 | 五月色丁香 | 日韩有码网站 | 超碰在线1 | 99视频在线 | 日韩有码在线观看视频 | 国产精品入口久久 | 天天操天天干天天 | 国产中文字幕在线看 | 亚洲精品国偷拍自产在线观看 | 国际精品久久久久 | 在线观看v片 | 天天曰天天干 | 亚洲一区二区三区在线看 | 天天曰夜夜爽 | 伊人视频| 操久在线| 国产手机视频在线观看 | 日本黄色一级电影 | 六月婷婷久香在线视频 | 日韩在线视频二区 | 五月天综合婷婷 | 国产高清亚洲 | 一级特黄av | 国产伦精品一区二区三区照片91 | 久久草草影视免费网 | 欧美精品免费视频 | 免费观看久久 | 91在线网站 | 亚洲欧美在线综合 | 亚洲精品中文字幕视频 | 国产不卡免费视频 | 国内精品久久久久久久久久久 | 久久一区二区三区超碰国产精品 | 日韩视| 国产韩国精品一区二区三区 | 99视频这里有精品 | 国产在线中文字幕 | 在线观看视频国产 | 九九热精| 美女免费视频观看网站 | 精品九九久久 | 成人国产电影在线观看 | 亚洲黄色三级 | 麻豆国产精品一区二区三区 | 久草免费在线 | 久久久久草 | 成年人在线电影 | 亚洲另类久久 | 麻豆91在线| 中文字幕亚洲欧美日韩 | 亚洲免费公开视频 | 亚洲精品在线观看不卡 | 国产小视频在线免费观看 | 麻豆视频免费看 | 久久久午夜视频 | 日韩av在线影视 | 国产在线高清 | 日韩电影久久久 | 亚洲aⅴ免费在线观看 | 午夜久久久久久久 | 国产精品永久免费观看 | 亚洲欧洲中文日韩久久av乱码 | 精品国产成人在线 | 国产一区麻豆 | 日韩精品在线看 | 欧美乱码精品一区 | 色婷婷激情网 | 久久久国产精品人人片99精片欧美一 | 国产午夜免费视频 | 特级西西444www大精品视频免费看 | 97精品久久人人爽人人爽 | 免费又黄又爽的视频 | 99久久国产免费,99久久国产免费大片 | 激情五月五月婷婷 | 九九av| 日韩欧美精品免费 | 91九色国产蝌蚪 | 99操视频 | av大片免费看 | 六月色播| 男女拍拍免费视频 | 外国av网| 精品国产精品久久一区免费式 | 欧美在线不卡一区 | 国产成人99久久亚洲综合精品 | 黄色在线免费观看网址 | 亚洲精品国产第一综合99久久 | 五月天电影免费在线观看一区 | 91精品人成在线观看 | 国产亚洲精品美女久久 | 婷婷av综合 | 国产日韩欧美在线 | 五月天综合激情网 | 国产无吗一区二区三区在线欢 | 热热热热热色 | 日日夜夜骑| 天天干天天操天天拍 | 九九精品视频在线看 | 在线免费av观看 | 激情欧美国产 | 国产精品黑丝在线观看 | 91久久久久久久 | 精品国产欧美 | 午夜在线观看 | 久久久久久久久久久免费av | 在线免费观看欧美日韩 | 在线观看视频h | 一区二区三区在线视频111 | 欧美国产不卡 | 夜夜澡人模人人添人人看 | 国产精品com | 激情五月婷婷激情 | 日韩高清在线观看 | 五月婷婷在线播放 | 在线亚洲精品 | 亚洲一区二区三区四区精品 | 欧美一级电影免费观看 | 国产成人福利在线 | 国产精品久久三 | 天堂va在线高清一区 | 日韩在线第一 | 成人免费观看视频大全 | 国产精品精品国产婷婷这里av | 国产二区电影 | 91精品视频导航 | 久久久久亚洲国产精品 | 色天天综合网 | 欧美成人黄色 | av中文字幕在线观看网站 | 97超碰人人网| 欧美激情精品久久久 | 久久精品国产一区 | 亚洲1区 在线 | 亚洲理论片在线观看 | 欧美成人91 | 99日精品| 色婷婷精品大在线视频 | 99久久爱| 国内三级在线 | www日韩精品 | 天天爽天天爽夜夜爽 | 91精选在线观看 | 欧美成人h版电影 | 激情导航| 天天拍天天草 | 久久激情五月婷婷 | 精品在线小视频 | 97精品国产97久久久久久久久久久久 | 日韩视频精品在线 | 91一区二区三区在线观看 | 国产一区视频在线观看免费 | 久久婷婷国产 | 日本精品一二区 | 色婷婷国产精品 | 久久免费视频这里只有精品 | 欧美精品中文 | 久草精品视频在线观看 | 日日夜夜精品免费 | 色婷婷亚洲精品 | 日韩一区二区三区观看 | 超碰av在线免费观看 | 黄色av免费在线 | 97av影院| 日韩在线观看你懂得 | 中文字幕免费观看全部电影 | 91麻豆福利| 奇米先锋| 免费在线播放黄色 | 婷婷精品在线视频 | 国产精品小视频网站 | 伊人色综合久久天天网 | 五月激情丁香婷婷 | 一区二区伦理电影 | 中文字幕在线播放日韩 | 中文字幕在线观看免费 | 久久激情视频 久久 | 手机在线看a | 91高清免费 | 中文字幕综合在线 | 麻豆91视频 | 人人爱爱 | av电影一区 | 黄色日批网站 | 91精品视频在线免费观看 | 亚洲天堂网在线观看视频 | 91男人影院 | av在线精品 | 看污网站 | 99久e精品热线免费 99国产精品久久久久久久久久 | 精品久久久久久久久中文字幕 | 91av在线视频免费观看 | 99久久99久久| 丁香婷婷社区 | 天天射夜夜爽 | 国产欧美中文字幕 | 婷婷丁香在线 | 97av在线视频免费播放 | 日韩黄色免费电影 | 中文字幕在线视频网站 | 国产精品高清在线观看 | 国产亚洲一级高清 |