將Jar檔案製作成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( &pi, 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.
&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檔案,我們的任務才全部完成。雙擊這個EXE檔案,我們的程式啟動了,看起來和傳統的Win32程式沒有兩樣,JRE完全被隱藏在底層。
補充幾條:
一、exe4j。
說明:exe4j可以將Jar檔案製作成exe檔案,但需jre支援,也可將Jar檔案放在外面。
軟體性質:共享軟體
下載地址:http://www.ej-technologies.com/products/exe4j/overview.html
二、JBuilder。
說明:新版本的JBuilder可以直接把工程製作成各系統的可執行檔案,包括Windows系統。
軟體性質:商業軟體
下載地址:略。我是從eMule下載的。
三、NativeJ。
說明:與exe4j功能類似。
軟體性質:共享軟體
下載地址:http://www.dobysoft.com/products/nativej/download.html
四、Excelsior JET。
說明:可以直接將Java類檔案製作成exe檔案,除AWT和Swing及第三方圖形介面外可不需jre支援(Java5.0不行)。
軟體性質:共享軟體
下載地址:http://excelsior-usa.com/home.html
五、jshrink。
說明:可將Jar檔案打包進exe檔案。同時具有混淆功能(這才是它的主要功能)。
軟體性質:共享軟體
下載地址:http://www.e-t.com/jshrink.html
六、InstallAnywhere。
說明:打包工具,對Java打包最好用。可打包成各作業系統執行包。包括Windows系統。
軟體性質:商業軟體。
下載地址:http://www.zerog.com/
七、InstallShieldX。
說明:與InstallAnywhere類似,但比InstallAnywhere功能強大。相對的,比較複雜,不易上手,我現在還沒學會。
軟體性質:商業軟體。
下載地址:http://www.installshield.com/
相關文章
- 把可執行jar打包成exe檔案JAR
- 將jar檔案放在伺服器中JAR伺服器
- Python將py檔案編譯為exe的方法Python編譯
- Matlab生成.exe格式檔案Matlab
- 命令列生成jar檔案命令列JAR
- SpringBoot 新增本地 jar 檔案Spring BootJAR
- 使用pyinstaller打包exe檔案教程
- pyinstaller打包python成.exe檔案Python
- Python教程:一篇檔案教你py檔案打包成exePython
- win10執行*.jar檔案的方法_win10如何開啟jar檔案Win10JAR
- 製作ISO檔案 與 提取ISO檔案
- 取證中exe檔案的分析
- 使用PyInstaller打包檔案為exe程式
- python 將 CVS檔案轉為HTML檔案PythonHTML
- 將bmp檔案壓縮為jpg檔案
- java中的JAR檔案淺析JavaJAR
- Hadoop系列,執行jar檔案命令HadoopJAR
- golang寫入檔案時,覆蓋前檔案(將前檔案清空)Golang
- 怎麼將ts檔案合成一個檔案
- 如何將.ipynb檔案轉換為.py檔案
- 如何將BigWig 檔案轉化為 bed 檔案
- 將 crt 檔案匯入到 jks 檔案 -cg
- 複製檔案githubGithub
- 使用 pyinstaller 打包 py 檔案成 exe 程式
- EXE檔案結構及讀取方法
- go編譯靜態檔案到exeGo編譯
- Springboot 獲取jar包中的檔案Spring BootJAR
- linux替換jar裡面的class檔案LinuxJAR
- 【Python培訓基礎】一篇檔案教你py檔案打包成exePython
- sed 將檔案反排
- 將自己的python程式碼打包成exe的可執行檔案Python
- 檔案批次查詢複製匯出,按檔名批次查詢檔案,按檔案內容批次查詢檔案
- python中pygame遊戲打包為exe檔案PythonGAM遊戲
- PyCharm GUI介面開發和exe檔案生成PyCharmGUI
- bat批處理轉換成exe檔案BAT
- Python 打包 windows 可執行的 exe 檔案PythonWindows
- 聊一聊 JAR 檔案和 MANIFEST.MFJAR
- 在pom檔案中新增jar包的方法JAR
- Matlab製作shp檔案Matlab