1. 程式人生 > >java程式釋出之jre篇 java程式打包成exe可執行安裝包以便安裝程式

java程式釋出之jre篇 java程式打包成exe可執行安裝包以便安裝程式

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完全被隱藏在底層

我的另外一部落格相關文章:http://hi.baidu.com/ouchuquan/item/28e16e16864c3c07d0d66df5

相關推薦

java程式釋出jre java程式打包exe執行安裝以便安裝程式

Java開發程式,釋出時總要考慮的問題就是怎麼在使用者的機器上裝好JRE。要考慮的問題很多:使用者有沒有能力獨自安裝JRE,使用者已有的 JRE 和我們需要的版本是不是一致,會不會出現版本問題,等等。使用.NET要考慮的問題就少些。現在.NET CLR似乎已經很普及了,看

如何將Java程式打包exe執行檔案

步驟 第一步:將Java程式通過Eclipse或者JRE匯出成Jar包; 第二步:通過exe4j將Jar包程式生成exe可執行檔案。 解決java檔案編譯為class檔案時提示:“錯誤:編碼GBK

Java桌面程式打包exe執行檔案

前言: 我們都知道Java可以將二進位制程式打包成可執行jar檔案,雙擊這個jar和雙擊exe效果是一樣一樣的,但感覺還是不同。其實將java程式打包成exe也需要這個可執行jar檔案。 準備: eclipse、exe4j(網上有軟體和帳號下載) 第一步,將ja

使用exe4j將java程式打包exe執行檔案

1.將java程式打包成jar 使用第三方外掛fatjar生成jar檔案,將net.sf.fjep.fatjar_0.0.31.jar直接拷貝到MyEclipse安裝目錄下的dropins資料夾中,然後重啟Eclipse即可。 重啟完成後,右擊java專案會

QT5的程式打包釋出打包exe執行程式

  QT打包的兩種方式: 一個是QT5自帶的windeployqt(不需要下載安裝),它可以找到程式(exe)用到的所有庫檔案,並且都拷貝到exe程式的當前檔案。此時打包的exe較小,需要和拷貝進來的檔案放一起執行,也可以將這些檔案再次打包成一個大的exe檔案,此時用的第二種

python程式打包exe執行檔案

1.安裝pyinstaller模組: 2.驗證安裝成功pyinstaler,該步驟只是為了心理安慰: 3.將自己的python檔案打包成exe: 輸入命令:pyinstaller  -F    **\**\**.py,如圖裡標黃所示,-F 後面內容為你想打包

使用pyinstaller將py檔案打包exe執行程式

注:博主使用的 python3.5.3版本。 1. 下載安裝 pyinstaller包。 在終端中,cd到 python目錄下的 Scripts目錄內。 使用pip命令下載安裝 pyinstaller。 等待安裝完成。 2. 用 pyinstaller打包py檔

java專案打包exe執行檔案

前言: 我們都知道Java可以將二進位制程式打包成可執行jar檔案,雙擊這個jar和雙擊exe效果是一樣一樣的,但感覺還是不同。其實將java程式打包成exe也需要這個可執行jar檔案。 準備: eclipse、exe4j(網上有軟體和帳號下載) 第一步,將jav

windows下使用cx_freeze將Python程式打包exe執行檔案

1.cxfreeze安裝 https://pypi.python.org/pypi/cx_Freeze 在以上地址可下載最新版本,選擇適合自己python版本的安裝包。安裝過程中會自動識別你的pytho

Java入坑瞭解&java安裝

Java 是一門低速但可靠的語言,具體歷史我就不多說啦。。。感興趣的小夥伴可以百度SUN公司哦,雖然中國沒有將其收購非常遺憾。 學習java首先要安裝的當然是JDK啦,具體安裝不過多贅述,因為下載下來你所要做的就是一直點下一步,直到安裝完成哦. 安裝完成後執行cmd在控制

如何將一個java程式打包一個執行程式

可以把普通的Java程式做成真正的exe,也就是單一個exe就可以在沒有安裝JVM的機器上執行。這樣的工具常見的有JET和gcj.前者是收費的,而且做出來的exe還是需要一堆dll。推薦使用gcj.他有windows和Linux版,直接下載zip包,不需要安裝,裡面有不少例子,一些build的批處理檔案。

[Java] Jar2Exe,jar2工具將jar轉換exe執行檔案的詳細過程

[Java] Jar2Exe,jar2工具將jar包轉換成exe可執行檔案的詳細過程 軟體下載地址 連結: https://pan.baidu.com/s/1Ei39JYGpb7wyS9UkMl1GTQ 提取碼: yvkv 一、首先將程式匯出為jar包 1、在MyEcli

web應用打包桌面執行程式

本教程旨在幫助開發人員把web應用程式打包成一個可執行的桌面應用程式,並生成一個安裝包setup.exe,直接安裝到本地電腦,方便使用者使用。 1、背景 開發web專案時,大多數選擇主流的chrome等瀏覽器作為開發除錯工具,但終端使用者可能要求相容IE等不常用的瀏覽器,此

java專案到處jar,轉.exe執行檔案

需要使用的工具: eclipse,exe4j,iocFx2(製作ico圖示) 具體轉換步驟分為兩步: 一、將java專案到處成jar包; 二、將匯出的jar包轉換成exe可執行檔案; 步驟一:將jav

0066 Linux中多個Java檔案打包單個執行jar檔案及其manifest.mf檔案編寫規則

現在我有三個Java類檔案:GuessGame.java Player.java GameLauncher.java(含主函式) 先用編譯命令: javac GuessGame.java Player

用py2exe將python檔案轉換exe執行程式

然後用pip install 命令安裝py2exe模組,如果你用的python是2.X,那還需要先安裝pip,這裡就不贅述了。 安裝完成後可在python的IDLE中import py2exe,如果不報錯則說明你安裝成功了: 2、然後將下面程式碼儲存為py_to_exe.py檔案:

linux環境下使用pyinstaller分步打包python程式(使用spec檔案將python程式打包一個執行檔案)

先貼上pyinstaler的官網指南,很多使用方法可以直接查到: pyinstaller的安裝: 在自己的環境下執行: pip install Pyinstaller 有什麼錯誤就根據錯誤提示去查,這個容易解決~ pyinstaller的初步使用:

怎樣將.java檔案編譯.exe執行檔案

需要下載與jdk位數相同的exe4j(exe for java)軟體。 1.   將需要的java程式碼打包成jar包。也就是以.jar為字尾的檔案。 如圖所示,選中需要打包的包,右擊選擇export 選中java下的jar file 然後, 然後下一步,下

關於Java的socket服務端專案如何打包exe檔案執行在伺服器上。

上篇我用mina框架的socket寫好了專案,後來一直糾結怎麼在伺服器上執行那個主類。終於,又是那個師兄提點了我。java專案先打包成.jar檔案,再用Lanuch4j工具生成.exe,然後執行在伺服器就行了。 下面就截圖好了,相信大家看得懂的。 1、打包成成jar檔案。

python 3.5 退回 3.4 打包window執行程式 py2exe

環境: python 3.5 windows 安裝了 https://www.continuum.io/downloads 【提示:用迅雷下載非常快】 程式寫完用  py2exe 打包: 首先安裝: pip install py2exe 執行: python setup