Eclipse 應(yīng)用可以使用Java Web Start部署,實(shí)現(xiàn)Rich Client。
這要求把所有的插件打包成獨(dú)立的jar,并且要簽署它。
如果要用到別人開(kāi)發(fā)的java庫(kù),就要利用eclipse提供的Create a plug-in project from existing JAR archives 把它做成 eclipse plugin。
Apache Jakarta有許多項(xiàng)目使用了commons-logging來(lái)寫(xiě)log。如果用到了這樣的項(xiàng)目,你也需要把commons-logging做成一個(gè) plugin。但是commons-logging在使用eclispe plugin包裝并使用Java Web Start部署時(shí),它會(huì)拋出異常
LogConfigurationException : Invalid class loader hierarchy. You have more than one version of org.apache.commons.logging.Log visible, which is not allowed.
究其原因,是JCL(Jakarta Commons Logging)中一直存在的classloader問(wèn)題。
簡(jiǎn)單來(lái)說(shuō),JCL使用調(diào)用者的classloader加載Log接口,這是最常見(jiàn)的類(lèi)載入方法;但是加載具體的實(shí)現(xiàn)類(lèi)是,用的是thread context classloader。
通常情況下,這兩個(gè)classloader是同一個(gè)。但是Eclipse有一套插件類(lèi)加載機(jī)制,每個(gè)插件使用不同的 classloader。在這個(gè)例子中,加載Log接口是EclipseClassLoader,加載Log實(shí)現(xiàn)類(lèi)的thread context classloader是JNLPClassLoader,它們并不相同。問(wèn)題就來(lái)了,用不同classloader加載的類(lèi)被認(rèn)為是無(wú)關(guān)的,所以JCL 的實(shí)現(xiàn)類(lèi)不能賦給Log接口類(lèi),就會(huì)拋出那個(gè)異常。
關(guān)于JCL classloader問(wèn)題更詳細(xì)解釋,請(qǐng)看log4j的創(chuàng)始人之一,Ceki Gülcü寫(xiě)的文章
為了解決這個(gè)問(wèn)題,我啟動(dòng)了一個(gè)項(xiàng)目,jcleclipse -- 重寫(xiě)了JCL,固定實(shí)現(xiàn)為把所有的log寫(xiě)到eclipse自己的ILog里。這樣就不用要求用戶在某個(gè)指定的地方建目錄來(lái)存儲(chǔ)log。
jcleclipse項(xiàng)目主頁(yè) http://jcleclipse.sourceforge.net/
jcleclipse項(xiàng)目概要 http://sourceforge.net/projects/jcleclipse
posted @ 2005-09-09 14:30 ravenix 閱讀(1266) | 評(píng)論 (1) | 編輯 收藏