2017-07-29 25 views
3

我想計算並記錄模塊的哈希值,該模塊的哈希直接取決於正在更新的模塊化JAR文件。爲此使用--hash-modules--module-path選項。 有我的嘗試:如何使用JDK 9 jar工具的--hash-modules和--module-path選項?

jar --hash-modules com.me.util --module-path "dist\com.me.jar;dist\com.me.util.jar" --update --file dist/com.me.jar --main-class=com.me.A --verbose --module-version 0.1 -C build/modules/com.me module-info.class build/modules/com.me/com/me/A.class build/modules/com.me/com/me/B.class 

jar --hash-modules "com.me.util;com.me.util" --module-path "dist\com.me.jar;dist\com.me.util.jar" --update --file dist/com.me.jar --main-class=com.me.A --verbose --module-version 0.1 -C build/modules/com.me module-info.class build/modules/com.me/com/me/A.class build/modules/com.me/com/me/B.class 

當我嘗試這樣做,我得到的警告信息:「沒有模塊被記錄在散列com.me」。

這些命令將無誤地創建* .jar文件(模塊),但不會添加任何哈希信息。我希望看到此信息並利用此功能(--hash-modules--module-path選項)。請告訴我該怎麼做!


項目文件夾的完整結構可以找到here

我使用jar工具的選項的實驗和工作示例是here

Java Platform, Standard Edition Tools Reference (jar)中描述的以下操作。

回答

4

Uddhav Gautam,謝謝link的額外文檔。

仔細閱讀文檔(Packaging: Modular JAR files (JEP 261: Module System)--hash-modules=PATTERN (Java Platform, Standard Edition Tools Reference))後,我意識到應該給出什麼參數來解決這個任務。

這裏有一個工作示例:

#Working command: 
#Create module: 
jar --hash-modules "com.me" --module-path "dist/com.me.jar" --verbose --create --file dist/com.me.util.jar -C build/modules/com.me.util module-info.class build/modules/com.me.util/com/me/util/Util.class 
jar --hash-modules "com.me" --module-path "dist/com.me.jar" -v -c -f dist/com.me.util.jar -C build/modules/com.me.util module-info.class build/modules/com.me.util/com/me/util/Util.class 

#Update module: 
jar --hash-modules "com.me" --module-path "dist/com.me.jar" --verbose --update --file dist/com.me.util.jar -C build/modules/com.me.util module-info.class 
jar --hash-modules "com.me" --module-path "dist/com.me.jar" -v -u -f dist/com.me.util.jar -C build/modules/com.me.util module-info.class 

要查看選項的效果,請使用以下命令:

#Describe module: 
jar --file dist/com.me.util.jar --describe-module 

結果應該是這樣的:

com.me.util jar:file:///C:/my_ch1_9/dist/com.me.util.jar/!module-info.class 
exports com.me.util 
requires java.base mandated 
hashes com.me SHA-256 85c0539e4ca9a01b00f4c29a1a8b01cd452d1d97f437166b8bb415046dac65cb 
+0

你做得很好。 –

+0

如果你做了'jar --hash-modules「com.me.jar」--module-path「dist」--verbose --create --file dist/com.me.util.jar -C build/modules/com.me.util module-info.class build/modules/com.me.util/com/me/util/Util.class' AND 'jar --hash-modules「com.me.jar「--module-path」dist「-v -c -f dist/com.me.util.jar -C build/modules/com.me.util module-info.class build/modules/com.me.util/com/me/util/Util.class' –

+1

第一個命令將重新創建jar文件,但不會添加哈希信息。將顯示警告信息: 警告:沒有模塊記錄在com中的哈希中。 me.util 添加清單 添加模塊信息:module-info.class 添加:com/me/util/Util.class(in = 411)(out = 268)(貶低34%) –

2

--hash-modules <ProvidePatternHere>/*你缺少樣式*/

http://openjdk.java.net/jeps/261

哈希值是隻記錄模塊名稱匹配的正則表達式

--module-path <LinkToModule> 

所以,一個完整的例子會是這樣的如下:

jar --hash-modules "*.jar" --module-path "dist" ... and your other stuffs here. 
+0

這示例將無效:出現錯誤(線程「main」中的異常java.lang.Error:jdk.jartool/sun.tools.jar中的消息文件中出現錯誤。 Main.getMsg(Main.java:194)...))jar --hash-modules「* .jar」--module-path「dist」--update --file dist/com.me.jar --main -class = com.me.A --verbose --module-version 0.1 -C build/modules/com.me module-info.class build/modules/com.me/com/me/A.class build/modules/com.me/com/me/B.class –