Sun公司的首席工程師——Mark Reinhold一直主張將Sun JDK模塊化。他舉例說(shuō)明了復(fù)雜性如何損害這個(gè)平臺(tái),以及JDK 6 update 10版的Java Kernel和Quickstarter的功能只是解決了JDK長(zhǎng)期關(guān)聯(lián)成長(zhǎng)導(dǎo)致的表面詬病。
Mark首先解釋了JDK為何會(huì)成為現(xiàn)在這樣龐大的狀態(tài):
JDK非常大,但還沒(méi)有像宇宙這么大。
JDK很大是因?yàn)樵谶^(guò)去13年里,Java SE平臺(tái)已經(jīng)從一個(gè)最初打算用于嵌入式設(shè)備的小系統(tǒng)發(fā)展成為橫跨廣闊領(lǐng)域、服務(wù)于廣大需求的一套豐富的庫(kù)集合。擁有這樣一個(gè)龐大且功能強(qiáng)大的瑞士軍刀真是難以置信的方便,不過(guò)尺寸卻不合適。
他接著解釋了由此導(dǎo)致的缺點(diǎn):
JDK很大——同時(shí)也是緊密關(guān)聯(lián)的。它作為一個(gè)整體的軟件系統(tǒng)構(gòu)建。在這種開(kāi)發(fā)模式下,當(dāng)編寫(xiě)新代碼或者改進(jìn)老代碼的時(shí)候,很自然地會(huì)利用平臺(tái)的其他部分,依靠Java虛擬機(jī)的靈活鏈接機(jī)制保證運(yùn)行時(shí)一切都正常工作。
但是多年來(lái),這種開(kāi)發(fā)形式導(dǎo)致了API之間的意想不到的關(guān)聯(lián)——和API的實(shí)現(xiàn)之間——這又增加了啟動(dòng)時(shí)間和內(nèi)存占用。例如,一個(gè)簡(jiǎn)單的命令行“Hello, world!”程序,現(xiàn)在加載和初始化超過(guò)300個(gè)單獨(dú)的類(lèi),盡管做出了更優(yōu)秀的工程優(yōu)化(比如類(lèi)共享),但是在最新的桌面系統(tǒng)上仍然需要100毫秒。當(dāng)然,對(duì)于更大的應(yīng)用來(lái)說(shuō),情況會(huì)更糟糕。
Mark似乎認(rèn)為JDK 6 update 10版中的Java Kernel和Quickstarter功能是不夠的:
JDK 6 update 10版的Java Kernel和Quickstarter功能的確改善了下載時(shí)間和(冷)啟動(dòng)時(shí)間,至少對(duì)Windows用戶(hù)來(lái)說(shuō)是這樣。這些技術(shù)也確實(shí)解決了長(zhǎng)期關(guān)聯(lián)成長(zhǎng)的表面詬病,但是,沒(méi)有解決根本問(wèn)題。
模塊化JDK——最有希望改進(jìn)下載時(shí)間、啟動(dòng)時(shí)間和內(nèi)存占用這些關(guān)鍵值的方法是正面解決根本問(wèn)題:把JDK劃分為一系列定義良好的、單獨(dú)的、但是互相依賴(lài)的模塊。
他又談?wù)摿四K化對(duì)平臺(tái)的好處:
把JDK分解為模塊的過(guò)程會(huì)強(qiáng)迫所有意想不到的關(guān)聯(lián)公開(kāi)化,然后經(jīng)過(guò)分析,多數(shù)會(huì)被隱藏或者消除。這反過(guò)來(lái),會(huì)減少加載類(lèi)的總數(shù),從而改善啟動(dòng)時(shí)間和內(nèi)存占用。
如果我們有一個(gè)模塊化的JDK,在下載時(shí),我們就會(huì)提供啟動(dòng)特定應(yīng)用所需的那些模塊,而不是整個(gè)JRE。Java Kernel是這種解決方案的第一步,使用定義良好的模塊的進(jìn)一步好處是下載流可以根據(jù)當(dāng)前應(yīng)用的特定需要提前定制。
Weijun對(duì)最初的帖子發(fā)表了意見(jiàn),認(rèn)為JDK的整體特性是由于Java沒(méi)有管理依賴(lài)的合適方式導(dǎo)致的:
JDK很大是因?yàn)镴ava從來(lái)沒(méi)有指定任何管理軟件依賴(lài)的工業(yè)級(jí)方法。
因此,可靠部署java棧的辦法就是把它打包成一個(gè)巨大的怪物。
順便說(shuō)一句,只有SUN和其JDK是這樣的。這種缺少依賴(lài)性管理的最壞結(jié)果不是導(dǎo)致JDK臃腫,而是所有帶有硬編碼類(lèi)路徑和大量分支的無(wú)法管理的應(yīng)用(因?yàn)槿绻銦o(wú)法獨(dú)立的管理和更新依賴(lài),你可能會(huì)分支出一個(gè)被迫綁定到應(yīng)用的私有拷貝)。
你應(yīng)該很容易理解為什么Java只存在于J2EE服務(wù)器中(服務(wù)器提供了基礎(chǔ)java平臺(tái)所缺少的管理功能)
GeekyCoder認(rèn)為模塊化的JDK對(duì)大多數(shù)開(kāi)發(fā)人員來(lái)說(shuō)可能不是最急需的:
雖然這很“酷”,但我懷疑這對(duì)大多數(shù)開(kāi)發(fā)人員來(lái)說(shuō)是否是最急需的。
我有一種不好的感覺(jué),就是你可能會(huì)被少數(shù)對(duì)你博客的積極回應(yīng)所影響,而不論他們是否代表了整個(gè)Java開(kāi)發(fā)社區(qū)。
即使只是修復(fù)一個(gè)票數(shù)最多的bug也比僅僅搞“酷”要好得多。
我認(rèn)為“傾聽(tīng)你的客戶(hù)”只是一個(gè)過(guò)時(shí)的、封閉的、已經(jīng)被徹底拋棄的想法,但是,看一看好的方面...你現(xiàn)在擁有兩名聲稱(chēng)樂(lè)于助人的開(kāi)發(fā)人員。祝你好遠(yuǎn)。
Similarly Michael B似乎認(rèn)為企業(yè)用戶(hù)不關(guān)心模塊化JDK:
模塊化的JDK(或更確切地說(shuō)JRE)對(duì)企業(yè)用戶(hù)完全無(wú)關(guān)。我認(rèn)為,企業(yè)用戶(hù)喜歡JDK它現(xiàn)在的樣子,因?yàn)槟K意味著依賴(lài),這聽(tīng)起來(lái)像“DLL地獄” 。現(xiàn)在JDK很容易分發(fā)和打補(bǔ)丁,這很重要。另外,Java具有良好的向上兼容性:不僅“編寫(xiě)一次,到處運(yùn)行” ,而且還“編寫(xiě)一次,永遠(yuǎn)運(yùn)行” ,這意味著巨大的投資回報(bào)率( ROI )。這是人們更喜歡Java而不是.NET的原因之一 。MS的戰(zhàn)略一直是: “這是添加了最新功能的新版本,請(qǐng)修改和兼容你的所有應(yīng)用。 ”MS技術(shù)太*了。 Java平臺(tái)目前已經(jīng)模塊化:模塊是我的應(yīng)用所需要的第三方庫(kù)。我喜歡SUN的模式——只有這些庫(kù)足夠成熟了才會(huì)變成平臺(tái)的一部分。 健壯性和可靠性是Java成功的關(guān)鍵。所以,請(qǐng)回去繼續(xù)解決那些剩余的bug吧。我真的很喜歡JDK 6 update 10版的這方面功能。
Mark首先解釋了JDK為何會(huì)成為現(xiàn)在這樣龐大的狀態(tài):
JDK非常大,但還沒(méi)有像宇宙這么大。
JDK很大是因?yàn)樵谶^(guò)去13年里,Java SE平臺(tái)已經(jīng)從一個(gè)最初打算用于嵌入式設(shè)備的小系統(tǒng)發(fā)展成為橫跨廣闊領(lǐng)域、服務(wù)于廣大需求的一套豐富的庫(kù)集合。擁有這樣一個(gè)龐大且功能強(qiáng)大的瑞士軍刀真是難以置信的方便,不過(guò)尺寸卻不合適。
他接著解釋了由此導(dǎo)致的缺點(diǎn):
JDK很大——同時(shí)也是緊密關(guān)聯(lián)的。它作為一個(gè)整體的軟件系統(tǒng)構(gòu)建。在這種開(kāi)發(fā)模式下,當(dāng)編寫(xiě)新代碼或者改進(jìn)老代碼的時(shí)候,很自然地會(huì)利用平臺(tái)的其他部分,依靠Java虛擬機(jī)的靈活鏈接機(jī)制保證運(yùn)行時(shí)一切都正常工作。
但是多年來(lái),這種開(kāi)發(fā)形式導(dǎo)致了API之間的意想不到的關(guān)聯(lián)——和API的實(shí)現(xiàn)之間——這又增加了啟動(dòng)時(shí)間和內(nèi)存占用。例如,一個(gè)簡(jiǎn)單的命令行“Hello, world!”程序,現(xiàn)在加載和初始化超過(guò)300個(gè)單獨(dú)的類(lèi),盡管做出了更優(yōu)秀的工程優(yōu)化(比如類(lèi)共享),但是在最新的桌面系統(tǒng)上仍然需要100毫秒。當(dāng)然,對(duì)于更大的應(yīng)用來(lái)說(shuō),情況會(huì)更糟糕。
Mark似乎認(rèn)為JDK 6 update 10版中的Java Kernel和Quickstarter功能是不夠的:
JDK 6 update 10版的Java Kernel和Quickstarter功能的確改善了下載時(shí)間和(冷)啟動(dòng)時(shí)間,至少對(duì)Windows用戶(hù)來(lái)說(shuō)是這樣。這些技術(shù)也確實(shí)解決了長(zhǎng)期關(guān)聯(lián)成長(zhǎng)的表面詬病,但是,沒(méi)有解決根本問(wèn)題。
模塊化JDK——最有希望改進(jìn)下載時(shí)間、啟動(dòng)時(shí)間和內(nèi)存占用這些關(guān)鍵值的方法是正面解決根本問(wèn)題:把JDK劃分為一系列定義良好的、單獨(dú)的、但是互相依賴(lài)的模塊。
他又談?wù)摿四K化對(duì)平臺(tái)的好處:
把JDK分解為模塊的過(guò)程會(huì)強(qiáng)迫所有意想不到的關(guān)聯(lián)公開(kāi)化,然后經(jīng)過(guò)分析,多數(shù)會(huì)被隱藏或者消除。這反過(guò)來(lái),會(huì)減少加載類(lèi)的總數(shù),從而改善啟動(dòng)時(shí)間和內(nèi)存占用。
如果我們有一個(gè)模塊化的JDK,在下載時(shí),我們就會(huì)提供啟動(dòng)特定應(yīng)用所需的那些模塊,而不是整個(gè)JRE。Java Kernel是這種解決方案的第一步,使用定義良好的模塊的進(jìn)一步好處是下載流可以根據(jù)當(dāng)前應(yīng)用的特定需要提前定制。
Weijun對(duì)最初的帖子發(fā)表了意見(jiàn),認(rèn)為JDK的整體特性是由于Java沒(méi)有管理依賴(lài)的合適方式導(dǎo)致的:
JDK很大是因?yàn)镴ava從來(lái)沒(méi)有指定任何管理軟件依賴(lài)的工業(yè)級(jí)方法。
因此,可靠部署java棧的辦法就是把它打包成一個(gè)巨大的怪物。
順便說(shuō)一句,只有SUN和其JDK是這樣的。這種缺少依賴(lài)性管理的最壞結(jié)果不是導(dǎo)致JDK臃腫,而是所有帶有硬編碼類(lèi)路徑和大量分支的無(wú)法管理的應(yīng)用(因?yàn)槿绻銦o(wú)法獨(dú)立的管理和更新依賴(lài),你可能會(huì)分支出一個(gè)被迫綁定到應(yīng)用的私有拷貝)。
你應(yīng)該很容易理解為什么Java只存在于J2EE服務(wù)器中(服務(wù)器提供了基礎(chǔ)java平臺(tái)所缺少的管理功能)
GeekyCoder認(rèn)為模塊化的JDK對(duì)大多數(shù)開(kāi)發(fā)人員來(lái)說(shuō)可能不是最急需的:
雖然這很“酷”,但我懷疑這對(duì)大多數(shù)開(kāi)發(fā)人員來(lái)說(shuō)是否是最急需的。
我有一種不好的感覺(jué),就是你可能會(huì)被少數(shù)對(duì)你博客的積極回應(yīng)所影響,而不論他們是否代表了整個(gè)Java開(kāi)發(fā)社區(qū)。
即使只是修復(fù)一個(gè)票數(shù)最多的bug也比僅僅搞“酷”要好得多。
我認(rèn)為“傾聽(tīng)你的客戶(hù)”只是一個(gè)過(guò)時(shí)的、封閉的、已經(jīng)被徹底拋棄的想法,但是,看一看好的方面...你現(xiàn)在擁有兩名聲稱(chēng)樂(lè)于助人的開(kāi)發(fā)人員。祝你好遠(yuǎn)。
Similarly Michael B似乎認(rèn)為企業(yè)用戶(hù)不關(guān)心模塊化JDK:
模塊化的JDK(或更確切地說(shuō)JRE)對(duì)企業(yè)用戶(hù)完全無(wú)關(guān)。我認(rèn)為,企業(yè)用戶(hù)喜歡JDK它現(xiàn)在的樣子,因?yàn)槟K意味著依賴(lài),這聽(tīng)起來(lái)像“DLL地獄” 。現(xiàn)在JDK很容易分發(fā)和打補(bǔ)丁,這很重要。另外,Java具有良好的向上兼容性:不僅“編寫(xiě)一次,到處運(yùn)行” ,而且還“編寫(xiě)一次,永遠(yuǎn)運(yùn)行” ,這意味著巨大的投資回報(bào)率( ROI )。這是人們更喜歡Java而不是.NET的原因之一 。MS的戰(zhàn)略一直是: “這是添加了最新功能的新版本,請(qǐng)修改和兼容你的所有應(yīng)用。 ”MS技術(shù)太*了。 Java平臺(tái)目前已經(jīng)模塊化:模塊是我的應(yīng)用所需要的第三方庫(kù)。我喜歡SUN的模式——只有這些庫(kù)足夠成熟了才會(huì)變成平臺(tái)的一部分。 健壯性和可靠性是Java成功的關(guān)鍵。所以,請(qǐng)回去繼續(xù)解決那些剩余的bug吧。我真的很喜歡JDK 6 update 10版的這方面功能。

