Dev Zone
          偏執(zhí)狂才能生存,人生/事業(yè)的路上需要再堅(jiān)持一下
          但是又怎么說得清堅(jiān)持的結(jié)果,道得盡堅(jiān)持的含義

            下午,試用了SkinLF(http://www.l2fprod.com),感覺非常好,程序的外觀得到了很大的改善,還可以根據(jù)自己的需要隨意調(diào)整得到自己想要的外觀,但是要將SkinLF應(yīng)用到Web Start中還有點(diǎn)問題。這是因?yàn)椋瑆eb start使用到的資源必須包裝成jar文件,以的形式定義到j(luò)nlp資源文件中,而SkinLF的外觀配置文件是zip形式的。也許有人會(huì)說,把zip轉(zhuǎn)化成jar文件就可以了。是的,想象中這應(yīng)當(dāng)是可以的,可是實(shí)際情況不是如此,你會(huì)發(fā)現(xiàn)使用ClassLoader.getResourceStream("themepack.jar")的時(shí)候返回了Null,SkinLookAndFeel.loadLookAndFeel()會(huì)異常Stream closed.

            調(diào)試之后發(fā)現(xiàn),即使是在客戶端,在Eclipse中運(yùn)行的時(shí)候,如果不把themepack.jar定義到ClassPath中,也是無法加載的。

            我想這是一個(gè)普遍的問題,根據(jù)我的理解,如果其他資源,比如圖片、xml文件、屬性文件等等能夠被加載,themepack.jar也應(yīng)該被加載。事實(shí)上應(yīng)該是這樣,但是關(guān)鍵在于SkinLF需要采用ZipInputStream解析zip(jar)文件,這時(shí)情況就不一樣了。具體的原因目前沒有搞清楚。

            在網(wǎng)上找了半天,終于發(fā)現(xiàn)一個(gè)Open Source的組件:Rachel,使用它很輕易就可以解決上面提到的問題。

            Rachelhttp://rachel.sourceforge.net)是一個(gè)為解決Web start裝載資源困難而開發(fā)的組件。它提供了兩種方法解決資源裝載問題。

               方法一,使用class://URL Handler。
                這個(gè)方法采用新的URL協(xié)議:class://從jar文件中獲取資源。

               Step 1,注冊新的URL Handler,以支持class://協(xié)議(protocal)。
               例子:java.net.URL.setURLStreamHandlerFactory( new RachelUrlFactory() );

               Step 2,采用class://協(xié)議構(gòu)造URL,從jar文件中讀取資源。
            語法:class:///
            例子:

          class://test.LookAndFeelTest/themepack.zip
          class://com.l2fprod.gui.plaf.skin.SkinLookAndFeel/themepack.zip


            注意:這里,是Rachel用來定義資源文件所在的jar的,后面的相對于jar中的根目錄而言。上述例子中的jar的結(jié)構(gòu)如下:

                test.jar:

                test
          /LookAndFeelTest.class
                com
          /l2fprod/gui/plaf/skin/SkinLookAndFeel.class
                themepack.zip
                images
          /example.png
                html
          /index.htm

            Step 3,采用java.net.URL獲取資源。
                例子:

              URL url = new URL("class://test.LookAndFeelTest/themepack.zip");
              URL url 
          = new URL("class://test.LookAndFeelTest/html/index.html");
              URL url 
          = new URL("class://test.LookAndFeelTest/images/example.png");

              URL url 
          = new URL("class://com.l2fprod.gui.plaf.skin.SkinLookAndFeel/themepack.zip");
              SkinLookAndFeel.setSkin( SkinLookAndFeel.loadThemePack(url) );

            方法二,在程序中嵌入多線程的,小型的http server。

            Step 1,把你的資源放到j(luò)ar中。

            Step 2,在每一個(gè)jar中增加一個(gè)anchor class,幫組server定位資源所在的jar文件,這點(diǎn)類似于方法一class:///的的
            例子:

             public class CrossRefAnchor
             {
               
          public CrossRefAnchor() {}
             }

            CrossRefAnchor沒有任何的實(shí)際意義,只是為了幫組定義資源所在的jar。

            Step 3,為每一個(gè)包含資源的jar用ClassResourceLoader注冊到WebResourceManager。
            例子:

             WebResourceManager roots = WebResourceManager.getInstance();
             roots.addResourceLoader( 
          new ClassResourceLoader( CrossRefAnchor.class ) );
             roots.addResourceLoader( 
          new ClassResourceLoader( JavaDocAnchor.class ) );

            Step 4,啟動(dòng)Server。
            例子:

             try
             {
               WebServer http 
          = new WebServer( 7272, roots );
               http.start();
             }
             
          catch( IOException e )
             {
               e.printStackTrace();
             }

            Step 5,采用URL從server獲取資源。
            例子:

             URL crossRefUrl = new URL( "http://localhost:7272/crossref/index.html" );
             URL url 
          = new URL( "http://localhost:7272/test.LookAndFeelTest/themepack.zip" );
             URL url 
          = new URL( "http://localhost:7272/test.LookAndFeelTest/html/index.html" );
             URL url 
          = new URL( "http://localhost:7272/test.LookAndFeelTest/images/example.png" );
          posted on 2005-05-17 22:11 dev 閱讀(1109) 評論(4)  編輯  收藏
          Comments
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            Dennis
            Posted @ 2005-05-18 12:05
            有更簡單的方法

            不是把 zip 取為 jar, 而是把 zip 放到 jar 內(nèi)

            把 themepack.zip 再在外打包成一個(gè)只有一個(gè)檔案的 jar
            (放在主要程式的 jar 內(nèi)也可, 但獨(dú)立放置更方便更新)

            例如
            themepack.jar
            \resource\themepack.zip

            themepack.jar
            \themepack.zip

            把 jar 放入 classpath (加到 webstart 的 jnlp 也可以)

            再使用 ClassLoader.getResourceStream("themepack.jar")
            或 ClassLoader.getResourceStream("/resource/themepack.jar")
            (跟據(jù) themepack.jar 的內(nèi)部路徑而定)

              回復(fù)  更多評論   
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            jdev
            Posted @ 2005-05-18 13:24
            不行的,會(huì)異常,你可以試一下。  回復(fù)  更多評論   
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            Dennis
            Posted @ 2005-05-18 16:06
            會(huì)嗎!?

            我只是把 zip 檔以一般 resource (e.g. *.properties, *.png) 的方式來做吧~?
            只是檔案會(huì)比較大吧!?

            (上面打錯(cuò)了 path, jar 內(nèi)的是 zip 才對)  回復(fù)  更多評論   
          • # re: 使用Rachel輕松解決Web Start裝載資源難的問題
            jdev
            Posted @ 2005-05-18 18:38
            我做過測試,不行。特殊就特殊在是zip格式,SkinLF需要讀取zip中的內(nèi)容,也就是說需要采用ZipInputStream讀取zip文件,讀取的時(shí)候會(huì)異常,也許這是sun的一個(gè)bug。  回復(fù)  更多評論   

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
           
          主站蜘蛛池模板: 呼伦贝尔市| 民权县| 沙坪坝区| 江北区| 剑阁县| 礼泉县| 上杭县| 博客| 东阿县| 麻城市| 嘉荫县| 永登县| 秦皇岛市| 梅河口市| 丹棱县| 凯里市| 安新县| 湟中县| 百色市| 宣恩县| 平顶山市| 江都市| 扬州市| 莫力| 夏邑县| 舞钢市| 大同市| 山阳县| 五莲县| 新沂市| 恩平市| 邢台县| 都江堰市| 二连浩特市| 黑河市| 南靖县| 温泉县| 安达市| 东平县| 开封县| 长沙市|