ravenix

          魚(yú)如何控制自己的呼吸
          posts - 7, comments - 3, trackbacks - 0, articles - 0
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2005年8月30日

          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)編輯 收藏

          如果用digister處理的xml里包含了外部dtd指定,即在!DOCTYPE中用PUBLIC指定外部dtd,即使使用了

          digester.setValidating(false);

          底層的sax解析器xerces仍然會(huì)去指定的地址去加載DTD,特別地,如果指定的地址無(wú)法獲得DTD,就會(huì)拋出異常:
          SAXException: The markup declarations contained or pointed to by the document type declaration must be well-formed

          為了避免這個(gè)問(wèn)題,可以使用這樣的語(yǔ)句:
          digester.setValidating(false);
          digester.setFeature(
          "http://apache.org/xml/features/nonvalidating/load-external-dtd",false);

          當(dāng)然這個(gè)設(shè)置只有在底層的sax解析器是xerces才有效。如果你使用的是其它的sax解析器,請(qǐng)參考解析器的文檔。

          posted @ 2005-08-30 15:57 ravenix 閱讀(1069) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 黄冈市| 伊金霍洛旗| 当雄县| 广昌县| 郓城县| 开阳县| 灵寿县| 枣阳市| 陆丰市| 定西市| 吉首市| 西林县| 乌鲁木齐县| 临江市| 林甸县| 郁南县| 湘乡市| 峨山| 衡山县| 夏津县| 肇州县| 同仁县| 华池县| 甘洛县| 淮南市| 西贡区| 陇川县| 阜南县| 武宁县| 双柏县| 义马市| 额济纳旗| 广水市| 板桥市| 赫章县| 金昌市| 临清市| 榆社县| 玉龙| 稷山县| 调兵山市|