indows下安裝flutter環(huán)境
下載鏈接:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
點(diǎn)擊圖片中的位置開(kāi)始下載
下載安裝成功后,配置環(huán)境變量,
步驟: 1. 右鍵“我的電腦”點(diǎn)擊“屬性” 2. 點(diǎn)擊“高級(jí)屬性設(shè)置” 3. 點(diǎn)擊“環(huán)境變量” 4. 打開(kāi)環(huán)境變量設(shè)置窗口 5.新建一個(gè)變量: JAVA_HOME: C:\Program Files\Java\jdk1.8.0_25(這個(gè)是你安裝的sdk根目錄的位置) 6.新建一個(gè) CLASSPATH: ;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 7.PATH中新加一個(gè) ;%JAVA_HOME%/bin;
這樣配置就完成了,打開(kāi)命令行工具運(yùn)行java,或者javac查看是否配置成功。
下載地址:
:https://flutter.io/sdk-archive/#windows
下載完成之后進(jìn)行解壓,然后配置系統(tǒng)變量
PATH中新加下面的內(nèi)容: D:\flutter\bin;
然后可以檢查下診斷下flutter
運(yùn)行flutter doctor 得到以下內(nèi)容 Android toolchain - develop for Android devices ? Android SDK at D:\Android\sdk ? Android SDK is missing command line tools; download from https://goo.gl/XxQghQ ? Try re-installing or updating your Android SDK, visit https://flutter.io/setup/#android-setup for detailed instructions.
需要安裝android sdk
下載地址:
https://developer.android.com/
需要科學(xué)上網(wǎng)下載
下載完成之后進(jìn)行安裝,安裝的時(shí)候盡量科學(xué)上網(wǎng),之前安裝過(guò)一次,出現(xiàn)莫名其妙的問(wèn)題,還無(wú)法解決,所以盡量科學(xué)上網(wǎng)下載,安裝。
安裝完成之后,打開(kāi)android studio 在剛打開(kāi)頁(yè)面
configure中打開(kāi)plugins下載flutter會(huì)自動(dòng)下載dart
完成之后重新啟動(dòng)android studio
現(xiàn)在在運(yùn)行 flutter doctor
Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 6.1.7601], locale zh-CN) [!] Android toolchain - develop for Android devices (Android SDK version 28.0.3) X Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses [√] Android Studio (version 3.4) [!] Connected device ! No devices available
得到以上內(nèi)容,然后運(yùn)行flutter doctor --android-licenses,一路選擇y完成之后再次運(yùn)行,
Doctor summary (to see all details, run flutter doctor -v): [√] Flutter (Channel stable, v1.2.1, on Microsoft Windows [Version 6.1.7601], locale zh-CN) [√] Android toolchain - develop for Android devices (Android SDK version 28.0.3) [√] Android Studio (version 3.4) [!] Connected device ! No devices available
4.安裝虛擬機(jī)
打開(kāi)android studio 新建一個(gè)flutter項(xiàng)目,完成之后,在編輯器的工具欄中找到tools下面的AVD Manager點(diǎn)擊打開(kāi)一個(gè)彈窗,
點(diǎn)擊crate virtual 按鈕,會(huì)彈出虛擬機(jī)列表,選中一個(gè)進(jìn)行安裝,安裝成功后會(huì)出現(xiàn)下面的列表,點(diǎn)擊按鈕就會(huì)彈出虛擬機(jī)彈窗,就可以進(jìn)行構(gòu)建調(diào)試,
這個(gè)時(shí)候有個(gè)能構(gòu)建的時(shí)候會(huì)出現(xiàn)問(wèn)題(構(gòu)建大概10分鐘左右),可以點(diǎn)擊debug模式,看是否報(bào)錯(cuò),如果報(bào)錯(cuò)需修改如下文件
“使之工作,工作得正確,工作得快速”,Kent Beck(極限編程的創(chuàng)建者和《測(cè)試驅(qū)動(dòng)開(kāi)發(fā):實(shí)戰(zhàn)與模式解析 》的作者)如是說(shuō)。
因此,在介紹了創(chuàng)建運(yùn)行時(shí)和應(yīng)用程序鏡像(甚至跨操作系統(tǒng))的細(xì)節(jié)之后,我們將轉(zhuǎn)向優(yōu)化。這可以極大地減小鏡像尺寸,并略微提高運(yùn)行時(shí)性能,特別是啟動(dòng)時(shí)間。
在jlink中,優(yōu)化由插件處理。因此,在使鏡像更小和更快之前,有必要先討論一下插件架構(gòu)。
jlink的核心是它的模塊化設(shè)計(jì)。除了選擇正確的模塊并生成鏡像的基本步驟之外,jlink將鏡像的進(jìn)一步處理留給了插件。你可以通過(guò)jlink --list-plugins查看可用的插件,或者查看表14-1(我們將在后文中查看每個(gè)插件)。
表14-1 字母序的jlink插件列表,指明插件是減小鏡像大小還是提高
運(yùn)行時(shí)性能
注意 文檔和jlink本身也列出了vm插件,讓你能從幾個(gè)HotSpot虛擬機(jī)(客戶機(jī)、服務(wù)器或最小虛擬機(jī))中選擇一個(gè),并包含在鏡像中。
理論上這是可行的,因?yàn)?4位JDK只與服務(wù)器VM一起發(fā)布。大多數(shù)情況下,你只有一個(gè)選擇。
01. 為jlink開(kāi)發(fā)插件
在本書(shū)出版時(shí),只有支持的插件是可用的,但當(dāng)添加更多的實(shí)驗(yàn)功能時(shí),這一點(diǎn)在未來(lái)可能發(fā)生改變。優(yōu)化鏡像的工作還處在開(kāi)發(fā)早期,很多工作仍在進(jìn)行中。由于沒(méi)有標(biāo)準(zhǔn)化,也沒(méi)有在Java 9及以上版本中導(dǎo)出,因此插件的API將來(lái)可能會(huì)改變。
這使得為jlink開(kāi)發(fā)插件變得非常復(fù)雜 ,也意味著在社區(qū)真正開(kāi)始貢獻(xiàn)插件之前,你必須等待一段時(shí)間。這樣做的意義是什么?
首先,編寫jlink插件有點(diǎn)像編寫代理程序或構(gòu)建工具插件,而不是在開(kāi)發(fā)典型的應(yīng)用程序。對(duì)類庫(kù)、框架和工具的支持是一項(xiàng)專門的任務(wù)。
但是讓我們回到社區(qū)提供的插件可以做什么的問(wèn)題上。一個(gè)用例來(lái)自profilers,它使用代理將性能跟蹤代碼注入正在運(yùn)行的應(yīng)用程序中。
使用jlink插件,你可以在鏈接的時(shí)候完成注入,而不是在執(zhí)行應(yīng)用程序時(shí)將時(shí)間花費(fèi)于此。如果你需要快速加載,那么這可能是一個(gè)明智的選擇。
另一個(gè)用例是增強(qiáng)Java Persistence API(JPA)實(shí)體的字節(jié)碼。例1如,Hibernate已經(jīng)使用代理來(lái)跟蹤哪些實(shí)體發(fā)生了變化[所謂的臟檢查(dirty checking)],而不必檢查每個(gè)字段。
這在鏈接時(shí)而非啟動(dòng)時(shí)是有意義的,這就是為什么Hibernate已經(jīng)為構(gòu)建工具和IDE提供了可以在它們構(gòu)建過(guò)程中實(shí)現(xiàn)這些功能的插件。
最后一個(gè)例子是一個(gè)非常好的、有潛力的jlink插件,此插件在鏈接時(shí)索引注解并使該索引在運(yùn)行時(shí)可用。這將大大減少應(yīng)用程序的啟動(dòng)時(shí)間,這些應(yīng)用程序?qū)呙枘K路徑以查找?guī)ё⒔獾?/span>bean實(shí)體。
02. 使用jlink插件
定義:插件命令行選項(xiàng)--${name}
掌握了理論知識(shí),現(xiàn)在讓我們真正使用一些插件吧。插件的使用非常簡(jiǎn)單:jlink根據(jù)每個(gè)插件的名稱自動(dòng)創(chuàng)建一個(gè)命令行選項(xiàng)--${name}。進(jìn)一步的參數(shù)傳遞取決于插件,并在jlink--list-plugins中進(jìn)行了描述。
去除調(diào)試符號(hào)是減小鏡像尺寸的好方法,為此,使用--stripdebug來(lái)創(chuàng)建鏡像。
這樣就可以了:lib/modules中的基本模塊大小從23 MB壓縮到了18MB(在Linux上)。
通過(guò)把重要文件放在前面來(lái)對(duì)lib/modules中的內(nèi)容進(jìn)行排序可以減少啟動(dòng)時(shí)間(盡管我懷疑效果是否明顯)。
這樣,首先是模塊描述符,然后是java.lang包中的類。
既然你已經(jīng)知道了如何使用插件,現(xiàn)在就該測(cè)試一些插件了。我們將分兩個(gè)部分進(jìn)行講解,第一部分關(guān)注縮減尺寸,第二部分關(guān)注性能改進(jìn)。
因?yàn)檫@是一個(gè)不斷演變的特性,同時(shí)也是相當(dāng)專業(yè)的特性,所以我不會(huì)詳細(xì)介紹官方的jlink文檔和jlink --list-plugins,而是盡量用盡可能少的文字進(jìn)行講解,但更精確地展示它們的用法。
讓我們逐個(gè)檢查縮小尺寸的插件并測(cè)量它們的效果。我本想在應(yīng)用程序鏡像上測(cè)試它們,但ServiceMonitor只有大約12個(gè)類,所以減小它的尺寸毫無(wú)意義。
我找不到一個(gè)可以免費(fèi)使用且完全模塊化的應(yīng)用程序,包括它的依賴。(在鏡像中沒(méi)有自動(dòng)模塊,還記得嗎?)相反,我將對(duì)這3個(gè)不同的運(yùn)行時(shí)鏡像上的工作量進(jìn)行衡量(括號(hào)中為變更前的尺寸):
1)base——僅包含java.base(45 MB);
2)services——java.base加上所有的服務(wù)提供者(150 MB);
3)java——所有java.*和javafx.*模塊,但不包括服務(wù)提供者(221MB)。
有趣的是,java相對(duì)于services具有更大的尺寸并不是由于更多的字節(jié)碼(lib/modules在java中比在services中更小一些),而是由于本地庫(kù),尤其是為JavaFX的WebView所捆綁的WebKit代碼。這將在試圖減小鏡像尺寸時(shí)幫助你理解插件的行為。(順便提一下,我正在為Linux做這件事情,但是其他操作系統(tǒng)的比例應(yīng)該也差不多。)
01. 壓縮鏡像
定義:壓縮插件
壓縮插件意在減小lib/modules的尺寸。它通過(guò)--compress=${value}選項(xiàng)來(lái)控制,包含3個(gè)合法值:
1)0——不壓縮(默認(rèn));
2)1——去重并且共享字符串內(nèi)容(意為String s ="text";中的"text");
3)2——利用Zip對(duì)lib/modules進(jìn)行壓縮。
可以通過(guò)--compress=${value}:filter=${pattern-list}來(lái)包含一個(gè)可選樣式列表,用來(lái)僅壓縮匹配這些樣式的文件。
該命令創(chuàng)建了一個(gè)僅包含基礎(chǔ)模塊的壓縮后的運(yùn)行時(shí)鏡像。
很明顯,你不需要嘗試0。對(duì)于1和2,我得到了以下結(jié)果:
1)base——45 MB → 39 MB (1) → 33 MB (2)
2)services——150 MB → 119 MB (1) → 91 MB (2)
3)java——221 MB → 189 MB (1) → 164 MB (2)
可以看到,壓縮率對(duì)于每個(gè)鏡像是不一樣的。services鏡像尺寸可以被減小將近40%,但更大的java鏡像只減小了25%。
這是由于compress插件僅對(duì)lib/modules有效,正如我們所討論的,它在兩個(gè)鏡像中幾乎都是相同的尺寸。因此,減小的絕對(duì)尺寸是相近的:對(duì)于每個(gè)鏡像都是大約60 MB,超過(guò)lib/modules初始尺寸的50%。
注意 通過(guò)--compress=2指定的Zip壓縮會(huì)增加啟動(dòng)時(shí)間——總的來(lái)說(shuō),鏡像越大,增加的時(shí)間越多。如果啟動(dòng)時(shí)間對(duì)你來(lái)說(shuō)很重要,那么請(qǐng)確保關(guān)注它所帶來(lái)的影響。
02. 排除文件和資源
定義:exclude-files與exclude-resources插件exclude-files和exclude-resources插件允許將文件從鏡像中排除。
相應(yīng)的選項(xiàng)--exclude-files=${pattern-list}和--exclude-resources=${pattern-list}接受一個(gè)樣式列表,用來(lái)匹配要排除的文件。
如同我在比較services和base鏡像的初始尺寸時(shí)所指出的,主要是JavaFX WebView的二進(jìn)制字節(jié)碼導(dǎo)致了java的尺寸變大。
在我的機(jī)器上,它是一個(gè)73 MB的lib/libjfxwebkit.so文件。下面演示了如何通過(guò)--exclude-files將它排除。
這實(shí)現(xiàn)了將鏡像減小73 MB的效果。下面是兩個(gè)告誡:
1) 這與人工將它們從鏡像中刪除有著相同效果;
2) 這使得只包含WebView的javafx.scene.web模塊幾近于無(wú)用,所以更好的選擇是不要包含這個(gè)模塊。
除了實(shí)驗(yàn)和學(xué)習(xí),排除來(lái)自于平臺(tái)模塊的內(nèi)容是糟糕的實(shí)踐。一定要對(duì)任何這樣的決定進(jìn)行深入研究,因?yàn)檫@有可能影響JVM的穩(wěn)定性。
對(duì)這些插件更好的用法是,將應(yīng)用程序或依賴JAR所包含但在應(yīng)用程序鏡像中不需要的文件進(jìn)行排除。可以是文檔、不需要的源代碼文件、不需關(guān)心的針對(duì)操作系統(tǒng)的二進(jìn)制字節(jié)碼、配置或者任何被別具匠心的開(kāi)發(fā)者放入歸檔文件中的東西。對(duì)于壓縮尺寸的比較也是沒(méi)有意義的:被排除文件所占的空間會(huì)被節(jié)省出來(lái)。
03. 排除不需要的語(yǔ)言環(huán)境
語(yǔ)言環(huán)境確實(shí)是值得刪除的來(lái)自于平臺(tái)模塊的內(nèi)容。正如你在上文所發(fā)現(xiàn)的,基礎(chǔ)模塊僅能在英語(yǔ)語(yǔ)言環(huán)境中工作,而jdk.localedata模塊包含了Java所支持的所有其他語(yǔ)言環(huán)境。
很不幸,這些語(yǔ)言環(huán)境加在一起大約有16 MB。如果你只需要一個(gè)或者幾個(gè)非英語(yǔ)語(yǔ)言環(huán)境,那這個(gè)尺寸還是有點(diǎn)大。
定義:include-locales插件
include-locales插件的作用是這樣的——通過(guò)--includelocales=${langs}選項(xiàng)生成的鏡像將僅包含它所指定的語(yǔ)言環(huán)境,其中${langs}是一個(gè)逗號(hào)分隔的BCP 47語(yǔ)言標(biāo)簽(類似于en-US、zh-Hans和fi-FI)列表。
該插件只在某個(gè)語(yǔ)言環(huán)境被jdk.localedata模塊放入鏡像時(shí)才有效果,所以它不會(huì)包括除基礎(chǔ)模塊所附帶的語(yǔ)言環(huán)境之外的其他語(yǔ)言環(huán)境,這是因?yàn)樗鼤?huì)排除jdk.localedata中的所有其他語(yǔ)言環(huán)境。
代碼清單14-4創(chuàng)建了一個(gè)ServiceMonitor的應(yīng)用程序鏡像,其包含了所有的jdk.localedata,因?yàn)樵搼?yīng)用程序在輸出中使用了芬蘭語(yǔ)格式。
這使得鏡像尺寸額外增加了16 MB,而你清楚如何將它減小回來(lái)。代碼清單14-7通過(guò)使用--include-locales=fi-FI來(lái)達(dá)到此目的。
相對(duì)于沒(méi)有使用jdk.localedata的鏡像,由此創(chuàng)建的鏡像的尺寸只進(jìn)行了最小限度的增加(準(zhǔn)確地說(shuō),168 KB)。成功!代碼清單14-7 創(chuàng)建帶有芬蘭語(yǔ)語(yǔ)言環(huán)境的ServiceMonitor應(yīng)用程序鏡像
通過(guò)排除語(yǔ)言環(huán)境能夠減少多少鏡像尺寸依賴于你需要多少種語(yǔ)言環(huán)境。如果是將一個(gè)國(guó)際化的應(yīng)用程序交付給一個(gè)全球性的客戶,那么將無(wú)法節(jié)省太多尺寸,但我認(rèn)為這種情況并不常見(jiàn)。如果應(yīng)用程序只支持少數(shù)或者甚至十幾種語(yǔ)言,那么將其他語(yǔ)言排除會(huì)節(jié)省幾乎16 MB。這個(gè)努力是否值得由你做主。
04. 剝離調(diào)試信息
當(dāng)你用IDE調(diào)試Java代碼時(shí),通常會(huì)看到精致的被格式化、命名甚至注釋過(guò)的源代碼。這是由于IDE獲取了相應(yīng)的真實(shí)源文件,將它們綁定到當(dāng)前正被執(zhí)行的字節(jié)碼,并且適宜地顯示了出來(lái)。這是最佳場(chǎng)景。
在沒(méi)有源文件時(shí),如果除了字段和方法參數(shù)名(必定存在于字節(jié)碼中)還能看到變量名(不是必須存在于字節(jié)碼中),也許你仍然可以看到具有良好可讀性的代碼。
如果反編譯代碼包含調(diào)試符號(hào),就會(huì)出現(xiàn)這種情況。這個(gè)信息使得調(diào)試更容易,但當(dāng)然也會(huì)占用空間。而jlink允許你將這些符號(hào)剝離。
定義:strip-debug插件
如果通過(guò)--strip-debug選項(xiàng)激活jlink的strip-debug插件,那么它將從鏡像的字節(jié)碼中刪除所有的調(diào)試信息,進(jìn)而減小lib/modules文件的尺寸。此選項(xiàng)沒(méi)有其他參數(shù)。
我在上面中使用過(guò)--strip-debug選項(xiàng),所以在此就不贅述了。來(lái)看一下它是如何減小鏡像尺寸的:
1) base——45 MB → 40 MB
2) services——150 MB → 130 MB
3) java——221 MB → 200 MB
這相當(dāng)于鏡像總尺寸的10%,但是請(qǐng)記住,這只影響了lib/modules,其減小了大約20%。
要點(diǎn) 一點(diǎn)警告:在沒(méi)有源文件和調(diào)試符號(hào)的情況下調(diào)試代碼是一件非常可怕的事情。也許你偶爾會(huì)通過(guò)遠(yuǎn)程調(diào)試連接到一個(gè)正在運(yùn)行的應(yīng)用程序,并且分析出現(xiàn)的問(wèn)題,如果放棄了那些調(diào)試符號(hào),你則不會(huì)很開(kāi)心,尤其是當(dāng)節(jié)省的那幾兆字節(jié)對(duì)你來(lái)說(shuō)并不重要的時(shí)候。小心考慮--strip-debug!
05. 將這些選項(xiàng)放在一起
雖然將文件和資源排除對(duì)于應(yīng)用程序模塊來(lái)說(shuō)會(huì)更好,但其他選項(xiàng)在純運(yùn)行時(shí)鏡像中運(yùn)行良好。讓我們把它們放在一起,并且嘗試為挑選出來(lái)的這3個(gè)模塊創(chuàng)建最小的鏡像。下面僅是java.base的命令行。
這是執(zhí)行的結(jié)果:
1)base——45 MB → 31 MB
2)services——150 MB → 75 MB(我同時(shí)刪除了除fi-FI之外的所有語(yǔ)言環(huán)境)
3)java——221 MB → 155 MB(或者82 MB,如果去除JavaFXWebKit的話)
這個(gè)結(jié)果不壞,是吧?
如你所見(jiàn),減小應(yīng)用程序或運(yùn)行時(shí)鏡像尺寸的方法有很多。我的猜測(cè)是,大多數(shù)開(kāi)發(fā)者在急切地盼望著性能的提高,尤其是在Spectre和Meltdown搶走了一些CPU周期后。
要點(diǎn) 很不幸,在這個(gè)領(lǐng)域我沒(méi)有太多好消息:基于jlink的性能優(yōu)化仍然處于早期階段,而已有的大多數(shù)或者已經(jīng)預(yù)期的優(yōu)化集中于提升啟動(dòng)時(shí)性能,而非長(zhǎng)期運(yùn)行時(shí)的性能。
一個(gè)現(xiàn)有的插件是system-modules。它默認(rèn)被打開(kāi),會(huì)預(yù)先計(jì)算系統(tǒng)模塊圖并且將之存儲(chǔ),以便快速訪問(wèn)。這樣,JVM就不需要在每次啟動(dòng)時(shí)都解析和處理模塊聲明以及驗(yàn)證可靠配置了。
另一個(gè)插件是class-for-name,它用some.Type.class來(lái)替換諸如Class.forName("some.Type")這樣的字節(jié)碼,進(jìn)而相對(duì)昂貴且基于反射的按名稱對(duì)類進(jìn)行的搜索則可以避免。我們簡(jiǎn)要地看過(guò)orderresources,其并沒(méi)有對(duì)性能有較大的改善。
目前,唯一支持的其他性能相關(guān)的插件是generate-jli-classes。合理配置后,它可以將初始化lambda表達(dá)式的代價(jià)從運(yùn)行時(shí)移動(dòng)到鏈接時(shí),但需要對(duì)方法句柄有很好的理解后,才能有效對(duì)它進(jìn)行學(xué)習(xí),所以我不會(huì)在此過(guò)多涉及這個(gè)話題。
這就是性能提升相關(guān)的所有內(nèi)容。如果你對(duì)于在此領(lǐng)域沒(méi)有獲得太多幫助而很失望,對(duì)此我表示理解。
但是請(qǐng)讓我指出,JVM已經(jīng)優(yōu)化的非常徹底了。所有低垂的果實(shí)(以及一些相對(duì)較高的果實(shí))都已經(jīng)被摘掉了,而要摘取剩下的果實(shí)還需要精巧的設(shè)計(jì)、大把的時(shí)間以及專業(yè)的工程能力。
jlink工具仍然年輕,我相信JDK開(kāi)發(fā)團(tuán)隊(duì)和社區(qū)會(huì)在適當(dāng)?shù)臅r(shí)候?qū)λ右岳谩?/span>
Java 10的應(yīng)用程序類數(shù)據(jù)共享。
Java 10引入了一個(gè)與jlink間接相關(guān)的優(yōu)化:應(yīng)用程序類數(shù)據(jù)共享。2實(shí)驗(yàn)證實(shí),它可以使得應(yīng)用程序啟動(dòng)加快10%到50%。有趣的是,你可以在應(yīng)用程序鏡像中應(yīng)用這項(xiàng)技術(shù),創(chuàng)建一個(gè)更加優(yōu)化的部署單元。
方便起見(jiàn),表14-2列出了本書(shū)討論的所有jlink命令行選項(xiàng)。更多信息可以參見(jiàn)官方文檔,或者使用jlink --help和jlink --listplugins。
表14-2 經(jīng)篩選的jlink字母序選項(xiàng)列表,包括插件。描述列基于官方文檔,引用列指向本書(shū)中詳細(xì)解釋如何使用這些選項(xiàng)的章節(jié)
1)命令行工具jlink基于指定的平臺(tái)模塊創(chuàng)建運(yùn)行時(shí)鏡像(使用jdeps來(lái)確定應(yīng)用程序需要哪些平臺(tái)模塊)。要從這個(gè)工具中受益,應(yīng)用程序需要運(yùn)行于Java 9及以上版本,但模塊化不是必需的。
2)一旦應(yīng)用程序和依賴被完全模塊化(而非利用自動(dòng)模塊),jlink就可以為它創(chuàng)建應(yīng)用程序鏡像,其中包含應(yīng)用程序的模塊。
3)所有對(duì)jlink的調(diào)用都需要指定以下參數(shù)。
1.--module-path,從哪里查找模塊(包括平臺(tái)模塊)。
2.--add-modules,所解析的根模塊。
3.--output,生成鏡像的輸出目錄。
4) 注意jlink如何解析模塊。
1.不會(huì)默認(rèn)綁定服務(wù)。
2.requires static指定的可選依賴不會(huì)被解析。
3.不允許使用自動(dòng)模塊。
4.確保通過(guò)--add-modules單獨(dú)地增加依賴的服務(wù)提供者或者可選依賴,或者通過(guò)--bind-services綁定所有服務(wù)提供者。
5) 當(dāng)心那些無(wú)須實(shí)現(xiàn)就可以隱式依賴的平臺(tái)服務(wù)。比如字符集(jdk.charsets)、語(yǔ)言環(huán)境(jdk.localedata)、Zip文件系統(tǒng)(jdk.zipfs)以及安全提供者(多個(gè)模塊)。
6) 由jlink生成的運(yùn)行時(shí)鏡像。
1.綁定到通過(guò)--module-path選擇的平臺(tái)模塊構(gòu)建所針對(duì)的操作系統(tǒng)。
2.與JDK和JRE有相同的目錄結(jié)構(gòu)。
3.將平臺(tái)和應(yīng)用程序模塊(統(tǒng)稱為系統(tǒng)模塊)融合進(jìn)lib/modules。
4.僅包含所需模塊的二進(jìn)制文件(在bin目錄中)。
7)使用bin/java --module ${initial-module}(無(wú)須模塊路徑,因?yàn)橄到y(tǒng)模塊被自動(dòng)解析)或者通過(guò)--launcher${name}=${module}/${main-class}創(chuàng)建的啟動(dòng)器來(lái)啟動(dòng)應(yīng)用程序鏡像。
8)利用應(yīng)用程序鏡像,模塊路徑可以用來(lái)增加額外的模塊(尤其是那些提供服務(wù)的模塊)。模塊路徑中與系統(tǒng)模塊同名的模塊會(huì)被忽略。