編者按:JDK軟件包之間的相互依賴性一直是使用Java 平臺(tái)最大的非議之一,因?yàn)榫偷骄唧w應(yīng)用的時(shí)候這會(huì)產(chǎn)生龐大臃腫的架構(gòu)。很多開(kāi)發(fā)者希望JDK 變小、變快,正處于開(kāi)發(fā)中的JDK7是否會(huì)實(shí)現(xiàn)這些功能、重鑄JDK的鋒芒呢?JDK7的進(jìn)展?fàn)顩r和新性能又是怎樣的呢?本文,JDK核心團(tuán)隊(duì)的工程師Alan Bateman就此展開(kāi)了話題:

JDK7的一個(gè)任務(wù)就是為我們提供模塊化平臺(tái),但要做到這一點(diǎn)真的很困難,因?yàn)樗拇a基與許多討厭的依賴有著千絲萬(wàn)縷的聯(lián)系,這些依賴存在于API和許多不同區(qū)域的執(zhí)行之間。這些依賴已經(jīng)建立了很多年,舉例來(lái)說(shuō):假設(shè)你正使用Logging API(java.util.logging)),Logging需要NIO和JMX,JMX需要JavaBeans, JNDI, RMI和CORBA,JNDI需要java.applet.Applet而且JavaBeans依賴AWT, Swing例子有很多,但結(jié)論很明顯:使用Logging API是非常不明智的,因?yàn)樽罱K這會(huì)導(dǎo)致對(duì)整個(gè)平臺(tái)的依賴。(這里要說(shuō)明一下:這些都只是依賴,logging當(dāng)然不需要真的去加載CORBA的超過(guò)1600個(gè)class)

好消息是,我們已經(jīng)開(kāi)始在上幾個(gè)構(gòu)建中做出進(jìn)步來(lái)解決這些問(wèn)題。Logging不再需要JMX(這需要一個(gè)API的變化:回退和重新訪問(wèn)(backed-out/re-visited));我們還析出RMI IIOP transport,這樣即便沒(méi)有CORBA你也可以遠(yuǎn)程管理;沒(méi)有JavaBeans,JMX也一樣可以自我測(cè)試;JNDI中不再需要java.applet.Applet;JavaBeans不再需要JDBC;AWT不再需要RMI

所以現(xiàn)在我們有了一個(gè)初步的模塊基礎(chǔ),尤其是核心庫(kù)(lang/io/net/util/nio/security)。原來(lái)存在于JNDI、部署代碼(deployment code)、AWT、參數(shù)、logging API及JMX中的依賴已經(jīng)被移除或者倒置。不過(guò)仍有一個(gè)XML解析下的依賴(來(lái)自java.util.Properties),但它很快也會(huì)被解決。

Swing, AWT, 2D等都已經(jīng)進(jìn)入了客戶端模塊化的階段。由于這些模塊中的API的關(guān)聯(lián)性很強(qiáng),所以模塊化工作很有挑戰(zhàn)性。還有一些來(lái)自于其他模塊(比如web服務(wù))的一些依賴,不過(guò)最終這些都會(huì)解決掉,到時(shí)可以用于嵌入式設(shè)備。

我們有幾個(gè)細(xì)粒度模塊,可能在未來(lái)被劃為粗粒度模塊。Logging, RMI, JSSE (SSL), SASL, JDBC, JNDI, LDAP以及其他JNDI供應(yīng)商、PKCS11和其他安全供應(yīng)商將為它們命名。JSSE是從平臺(tái)其他區(qū)域剝離的很好的例子,也許有人會(huì)認(rèn)為它不需要發(fā)送請(qǐng)求就可以做安全連網(wǎng),但由于SSL能夠基于身份驗(yàn)證來(lái)使用Kerberos,所以實(shí)際上JSSE取決于Kerberos/JGSS。這種情況下,依賴就是可選的,即如果安裝了Kerberos,那么在執(zhí)行安全的時(shí)候SSL會(huì)包括Kerberos密碼組件,如果沒(méi)有安裝Kerberos,則不會(huì)請(qǐng)求使用Kerberos。

我上文提到的CORBA還經(jīng)常成為用戶指責(zé)JDK承載的兼容包的話柄,因?yàn)橐粋€(gè)好的模塊應(yīng)該拋棄那些無(wú)用的、遺留的、不受歡迎的包的兼容。所以,Sean Mullan和Vincent Ryan在jdk7 b78中做了很多工作,刪除了對(duì)無(wú)用安全類的依賴,從而這些無(wú)用安全類就不必存在于基礎(chǔ)模塊中。其他準(zhǔn)備被移除的包括繼承的sun.io轉(zhuǎn)換器,我們?cè)鐟?yīng)該遺棄它只是JDBC驅(qū)動(dòng)對(duì)它的依賴尚未移除;還有sun.misc中的許多類也都沒(méi)用了,但我們還是沒(méi)法刪除因?yàn)樵S多應(yīng)用直接使用它們。

值得一提的是,模塊并不一定與封裝邊界(package boundaries)一致。當(dāng)然最理想的狀況是一個(gè)模塊涵蓋一個(gè)或多個(gè)完整包中所有的類,但許多情況下這是不可能的。我上文提到的JavaBeans就是一個(gè)很好的例子:將屬性事件支持(property event support)和注釋從自省和其他連接客戶端區(qū)域的類中分離出來(lái)。New I/O和Logging等API有管理界面,所以將管理界面、管理模塊與JMX、java.lang.management聚合很有意義。上文我還提到了IIOP transport從RMI Connector中分離,這種情況下,rmic編輯器將生成抽頭與javax.management.remote.rmi包聯(lián)系在一起,但我們不需要將這些與管理模塊聚合因?yàn)樗鼤?huì)產(chǎn)生對(duì)CORBA的依賴。

我希望通過(guò)我的上述能讓你了解JDK 7所正在做的。上文提到的很多都是為了移除依賴性,為的是一個(gè)更加模塊化的JDK,從而可以使我們更接近提高性能(下載和啟動(dòng)時(shí)間)、建立平臺(tái)縮放性的目標(biāo)。不過(guò)很多工作需要分幾步來(lái)完成,因此最初的構(gòu)建會(huì)生成JAR文件,但最終我們會(huì)轉(zhuǎn)換成一個(gè)更好的格式。(文/王玉磊)

原文鏈接:http://blogs.sun.com/alanb/entry/is_the_jdk_losing_its



dm520