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

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

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

    內蒙古java團隊

    j2se,j2ee開發組
    posts - 139, comments - 212, trackbacks - 0, articles - 65
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    java程序發布之jre篇

    Posted on 2006-12-25 14:34 帥子 閱讀(10686) 評論(7)  編輯  收藏 所屬分類: j2se技術專區
    Java開發程序,發布時總要考慮的問題就是怎么在使用者的機器上裝好JRE。要考慮的問題很多:使用者有沒有能力獨自安裝JRE,使用者已有的?JRE?和我們需要的版本是不是一致,會不會出現版本問題,等等。使用.NET要考慮的問題就少些。現在.NET?CLR似乎已經很普及了,看好多D版的?Win?XP都會自己安裝最新的.NET?CLR,而且似乎它的安裝界面也比JRE友好些。徹底解決安裝JRE的問題的方案,就是讓我們的應用程序自己背著JRE!這樣,我們的程序就像傳統的Win32應用程序一樣,雙擊就可以執行,不用管所在的機器上是否有JRE,是什么版本的JRE,無論怎樣,我有我自己的!要做到這一點,其實非常容易。
    王森在他的《Java深度歷險》(強力推薦這本書,內容少而精)的第一章就解釋了JDK,JRE,JVM之間的關系。解釋了我們執行java.exe時發生的事情。其中提到,java.exe依照一套邏輯來尋找可以用的JRE,首先查找自己所在的目錄下有沒有?JRE(據王森講這樣說不確切,我沒有JDK全部的源代碼,在此無從考證);其次查找自己的父目錄下有沒有JRE;最后才是查詢Windows的注冊表。
    通常我們在安裝好了JRE的機器上的任何一個目錄下都可以執行java.exe。因為它在安裝時被復制到了windows的system32目錄下,而后者無論如何都會在path環境變量中。這個java.exe最終必然會訪問注冊表來確定真正的JRE的所在地。若我們要求每一個應用程序都自帶JRE,必然不能走這條路。但,邏輯的第二條講,java.exe會在它的父目錄下查找JRE,解決方案就在這一條中。
    假設我們的應用程序打好了包,叫做?MyApp.jar,放在MyApp的目錄下。我們在MyApp目錄下,可以執行java??jar?MyApp.jar來運行我們的程序。我們安裝的是?JRE?1.5,在C:\Program?Files\Java\jre1.5.0下。現在,我們只需要簡單的將jre1.5.0目錄搬到MyApp目錄下,順便改個容易寫的名字比如叫jre。現在,我們的應用程序就象這樣:
    MyApp
    ???????MyApp.jar
    ???????Jre
    ??????????????Jre1.5.0目錄下的全部內容
    Java.exe?就在jre目錄下的bin目錄中。根據第二條邏輯,java.exe會在它的父目錄中查找jre,實驗證實,它會查找lib目錄,而lib就在jre目錄下。因此,這樣java.exe就會確定jre的所在然后正常執行java程序,不會去管我們是否安裝了JRE,注冊表中是否有注冊項這些雜事了。
    試一下,在命令行下進入MyApp的目錄下,假設它在C盤,將path指向MyApp下的JRE:
    set?path=c:\MyApp\jre\bin
    然后運行:
    java??verbose??jar?MyApp.jar
    加上verbose參數以確定我們確實用了這一套被搬出了家的JRE。
    程序可以運行,并且在命令行輸出的前幾行,可以看到:
    [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]
    因此程序讀取的確實是它的私有的JRE。
    至此,我們似乎完成了任務。但是現在我們的私有JRE仍不完美,缺點是太大。JRE?1.5有接近70MB,作為我們的私有的JRE,好多內容都是可以拋棄的。Jre目錄下的license都可以不要,bin下的執行文件只需要保留java.exe或者javaw.exe,lib下只要保留rt,jsse,?jce,charsets幾個庫就可以了。除了i386和zi兩個子目錄外,其余的子目錄都可以不要。Zi下只需要保留自己地區的子目錄和其下的一些文件就可以。Lib下除了庫之外的屬性文件等等都要保留。這樣清理一番,JRE仍然有接近50MB。還可以繼續清理幾個庫文件里面不需要的內容,這需要仔細的整理,會很費功夫。最好能寫出一個自動工具幫助我們整理它們。從Sun公司上下到的JMF里面附帶的用Java寫的媒體播放器就自帶了JRE,只有幾個?MB。
    清理過后需要運行幾遍我們的應用程序,以確保我們的JRE不缺少東西。
    如果我們希望能有一個程序直接啟動我們的應用程序,那就還要費些功夫。最簡單的方法是弄出一個快捷方式來,但是快捷方式的路徑不能是相對的,不方便我們安裝。我想到的方案就是用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(?π,?sizeof(pi)?);
    ?
    ????//?Start?the?child?process.?
    ????if(?!CreateProcess(?"jre\\bin\\javaw.exe",//執行的程序名
    ????????????????????????"jre\\bin\\javaw.exe?-jar?MyApp.jar",?//?帶參數的執行程序
    ????????????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.
    ????????????π?)?????????????//?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文件,我們的任務才全部完成。雙擊這個EXE文件,我們的程序啟動了,看起來和傳統的Win32程序沒有兩樣,JRE完全被隱藏在底層。

    評論

    # re: java程序發布之jre篇  回復  更多評論   

    2006-12-25 15:00 by ss
    恩,不錯,有助與學習,先收了,

    謝謝

    # re: java程序發布之jre篇  回復  更多評論   

    2008-11-04 14:53 by scut_ray
    建議:
    把java.exe也刪掉,然后自己寫個jvm.dll的引導程序

    # re: java程序發布之jre篇  回復  更多評論   

    2009-06-02 15:22 by fei
    不錯!學習了。多謝

    # re: java程序發布之jre篇  回復  更多評論   

    2010-06-14 14:33 by 路人
    學習了 謝謝

    # re: java程序發布之jre篇  回復  更多評論   

    2011-05-12 09:50 by 付俊
    好東西,學習

    # re: java程序發布之jre篇  回復  更多評論   

    2011-05-12 09:50 by 付俊
    好東西,學習!

    # re: java程序發布之jre篇  回復  更多評論   

    2012-06-26 15:43 by 懵懂
    看得不太懂
    主站蜘蛛池模板: 国产在线观看免费视频播放器| 国产精品入口麻豆免费观看| 日韩精品视频免费网址| 亚洲国产精品yw在线观看| 亚洲视频免费一区| 亚洲成人福利网站| 无码国产精品一区二区免费式直播| 91久久亚洲国产成人精品性色| 久久大香伊焦在人线免费| 亚洲国产一区国产亚洲| 最近中文字幕完整版免费高清| 亚洲精品乱码久久久久久下载 | 拍拍拍无挡视频免费观看1000| 亚洲成年人啊啊aa在线观看| 一级毛片免费观看不收费| 久久久久亚洲精品男人的天堂 | 久久大香香蕉国产免费网站| 亚洲美女免费视频| 在线看片免费不卡人成视频| 亚洲欧美日韩久久精品| 亚洲Av无码乱码在线znlu| 久久精品免费网站网| 国产亚洲一区二区三区在线观看| 一级毛片免费观看不卡视频| 亚洲乱码一二三四五六区| 午夜dj免费在线观看| 七次郎成人免费线路视频| 亚洲av无码精品网站| 免费无码精品黄AV电影| 亚洲精品宾馆在线精品酒店| 亚洲日韩中文在线精品第一| 四虎影视在线影院在线观看免费视频 | 亚洲精品蜜桃久久久久久| 2019中文字幕免费电影在线播放| 亚洲一区二区三区无码国产| 亚洲Aⅴ无码一区二区二三区软件| 中文无码日韩欧免费视频| 亚洲国产人成在线观看| 亚洲国产精品成人一区| 亚洲精品在线免费观看视频| 激情婷婷成人亚洲综合|