<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 56, comments - 54, trackbacks - 0, articles - 4
       ::  ::  :: 聯(lián)系 :: 聚合  :: 管理

    讓Java程序自帶JRE(轉(zhuǎn)載)

    Posted on 2005-12-30 11:23 Terry的Blog 閱讀(511) 評論(0)  編輯  收藏 所屬分類: java語言轉(zhuǎn)載

            用Java開發(fā)程序,發(fā)布時總要考慮的問題就是怎么在使用者的機(jī)器上裝好JRE。要考慮的問題很多:使用者有沒有能力獨(dú)自安裝JRE,
    使用者已有的JRE和我們需要的版本是不是一致,會不會出現(xiàn)版本問題,等等。使用.NET要考慮的問題就少些。現(xiàn)在.NET CLR似乎已經(jīng)很普及
    了,看好多D版的Win XP都會自己安裝最新的.NET CLR,而且似乎它的安裝界面也比JRE友好些。徹底解決安裝JRE的問題的方案,就是讓我
    們的應(yīng)用程序自己背著JRE!這樣,我們的程序就像傳統(tǒng)的Win32應(yīng)用程序一樣,雙擊就可以執(zhí)行,不用管所在的機(jī)器上是否有JRE,是什么版
    本的JRE,無論怎樣,我有我自己的!要做到這一點(diǎn),其實(shí)非常容易。


    王森在他的《Java深度歷險》(強(qiáng)力推薦這本書,內(nèi)容少而精)的第一章就解釋了JDK,JRE,JVM之間的關(guān)系。解釋了我們執(zhí)行java.exe時
    發(fā)生的事情。其中提到,java.exe依照一套邏輯來尋找可以用的JRE,首先查找自己?詰哪柯枷掠忻揮蠮RE(據(jù)王森講這樣說不確切,我沒有
    JDK全部的源代碼,在此無從考證);其次查找自己的父目錄下有沒有JRE;最后才是查詢Windows的注冊表。


    通常我們在安裝好了JRE的機(jī)器上的任何一個目錄下都可以執(zhí)行java.exe。因?yàn)樗诎惭b時被復(fù)制到了windows的system32目錄下,而后者
    無論如何都會在path環(huán)境變量中。這個java.exe最終必然會訪問注冊表來確定真正的JRE的所在地。若我們要求每一個應(yīng)用程序都自帶JRE,
    必然不能走這條路。但,邏輯的第二條講,java.exe會在它的父目錄下查找JRE,解決方案就在這一條中。


    假設(shè)我們的應(yīng)用程序打好了包,叫做MyApp.jar,放在MyApp的目錄下。我們在MyApp目錄下,可以執(zhí)行java –jar MyApp.jar來運(yùn)行我們
    的程序。我們安裝的是JRE 1.5,在C:\Program Files\Java\jre1.5.0下。現(xiàn)在,我們只需要簡單的將jre1.5.0目錄搬到MyApp目錄下,順
    便改個容易寫的名字比如叫jre。現(xiàn)在,我們的應(yīng)用程序就象這樣:

    MyApp

           MyApp.jar

           Jre

                  Jre1.5.0目錄下的全部內(nèi)容

    Java.exe就在jre目錄下的bin目錄中。根據(jù)第二條邏輯,java.exe會在它的父目錄中查找jre,實(shí)驗(yàn)證實(shí),它會查找lib目錄,而lib就在jre目
    錄下。因此,這樣java.exe就會確定jre的所在然后正常執(zhí)行java程序,不會去管我們是否安裝了JRE,注冊表中是否有注冊項這些雜事了。

    試一下,在命令行下進(jìn)入MyApp的目錄下,假設(shè)它在C盤,將path指向MyApp下的JRE:

    set path=c:\MyApp\jre\bin

    然后運(yùn)行:

    java –verbose –jar MyApp.jar

    加上verbose參數(shù)以確定我們確實(shí)用了這一套被搬出了家的JRE。

    程序可以運(yùn)行,并且在命令行輸出的前幾行,可以看到:

    [Opened C:\MyApp\jre\lib\rt.jar]

    [Opened C:\MyApp\jre\lib\jsse.jar]

    [Opened C:\MyApp\jre\lib\jce.jar]

    [Opened C:\MyApp\jre\lib\charsets.jar]

    因此程序讀取的確實(shí)是它的私有的JRE。

    至此,我們似乎完成了任務(wù)。但是現(xiàn)在我們的私有JRE仍不完美,缺點(diǎn)是太大。JRE 1.5有接近70MB,作為我們的私有的JRE,好多內(nèi)容都是
    可以拋棄的。Jre目錄下的license都可以不要,bin下的執(zhí)行文件只需要保留java.exe或者javaw.exe,lib下只要保留
    rt,jsse,jce,charsets幾個庫就可以了。除了i386和zi兩個子目錄外,其余的子目錄都可以不要。Zi下只需要保留自己地區(qū)的子目錄和其下
    的一些文件就可以。Lib下除了庫之外的屬性文件等等都要保留。這樣清理一番,JRE仍然有接近50MB。還可以繼續(xù)清理幾個庫文件里面不需
    要的內(nèi)容,這需要仔細(xì)的整理,會很費(fèi)功夫。最好能寫出一個自動工具幫助我們整理它們。從Sun公司上下到的JMF里面附帶的用Java寫的媒
    體播放器就自帶了JRE,只有幾個MB。


    清理過后需要運(yùn)行幾遍我們的應(yīng)用程序,以確保我們的JRE不缺少東西。

    如果我們希望能有一個程序直接啟動我們的應(yīng)用程序,那就還要費(fèi)些功夫。最簡單的方法是弄出一個快捷方式來,但是快捷方式的路徑不能是相
    對的,不方便我們安裝。我想到的方案就是用Win32程序包裝一下。在VS.NET下寫一個Win32小程序:

    int PASCAL WinMain( HINSTANCE hInstance,

        HINSTANCE hPrevInstance,

        LPSTR lpszCmdLine,

        int nCmdShow )

    {

        STARTUPINFO si;

        PROCESS_INFORMATION pi;

        ZeroMemory( &si, sizeof(si) );

        si.cb = sizeof(si);

        ZeroMemory( &pi, sizeof(pi) );

        // Start the child process.

        if( !CreateProcess( "jre\\bin\\javaw.exe",//執(zhí)行的程序名

                            "jre\\bin\\javaw.exe -jar MyApp.jar", // 帶參數(shù)的執(zhí)行程序

                NULL,             // Process handle not inheritable.

                NULL,             // Thread handle not inheritable.

                FALSE,            // Set handle inheritance to FALSE.

                0,                // No creation flags.

                NULL,             // Use parent’s environment block.

                NULL,             // Use parent’s starting directory.

                &si,              // Pointer to STARTUPINFO structure.

                &pi )             // Pointer to PROCESS_INFORMATION structure.

        )

        {

                ErrorExit( "CreateProcess failed." );

        }

         // Wait until child process exits.

        WaitForSingleObject( pi.hProcess, INFINITE );

         // Close process and thread handles.

        CloseHandle( pi.hProcess );

        CloseHandle( pi.hThread );

    }

    基本上是按照MSDN文檔中的例子照搬的。將它編譯成一個EXE文件,我們的任務(wù)才全部完成。雙擊這個EXE文件,我們的程序啟動了,看起來
    和傳統(tǒng)的Win32程序沒有兩樣,JRE完全被隱藏在底層。

    轉(zhuǎn)載地址 
    http://www.matrix.org.cn/resource/article/44/44085_java.html

    主站蜘蛛池模板: 亚洲国产a∨无码中文777| 免费在线观看的黄色网址| 4338×亚洲全国最大色成网站| 中文字幕无码亚洲欧洲日韩| 中国在线观看免费高清完整版| 亚洲成人网在线播放| 国产香蕉免费精品视频| 亚洲日韩国产精品无码av| 无遮免费网站在线入口| 亚洲熟女精品中文字幕| 国产乱子伦精品免费无码专区| 国产成人久久精品亚洲小说| 亚洲福利中文字幕在线网址| h视频免费高清在线观看| 亚洲精品无码永久中文字幕| 久久免费的精品国产V∧| 亚洲国产一区在线观看| 24小时日本在线www免费的| 亚洲1区2区3区精华液| 亚洲国产天堂久久久久久| 叮咚影视在线观看免费完整版| 黄色大片免费网站| 亚洲成a人在线看天堂无码| 成在线人免费无码高潮喷水| 亚洲一区中文字幕久久| 处破痛哭A√18成年片免费| 九九视频高清视频免费观看| 亚洲人成电影在在线观看网色| 美女视频黄的全免费视频 | 亚洲妇女水蜜桃av网网站| 岛国大片免费在线观看| 日韩a毛片免费观看| 久久精品亚洲日本佐佐木明希| 两个人的视频高清在线观看免费| 国产成人综合亚洲绿色| 久久噜噜噜久久亚洲va久| 免费99精品国产自在现线| caoporn国产精品免费| 91亚洲视频在线观看| 亚洲欧洲日产国码一级毛片 | 特级做A爰片毛片免费看无码|