教你打包Java程式,jar轉exe隨處可跑
發現很多人問如何把Jar轉成exe程式。可能是想雙擊執行和隨處執行。其實這個並不難,我就簡單總結幾種方法,供大家參考,關鍵還是要知其所以然。
Java程式的執行不可能脫離JRE,不管你是Jar包還是exe程式。這點你必須瞭解。那麼在沒有JRE的機器上你的程式怎麼跑?很簡單,在你程式裡帶一份JRE就行了。
先介紹集中打包的方法。以Eclipse為例,最簡單直接的方法,選擇你想打包的程式,右鍵export…
選擇Runnable Jar file。(即可執行的Jar包)
選擇你程式的主類,就是還有Main函式的類。點Finish即可。
在你的機器上,設定好Jar檔案的開啟方式(別預設用解壓縮的工具開啟就行),雙擊即可執行。
這個跟在命令列執行命令的效果是一樣的。
java -jar forfun.jar
其實一個Jar能執行,關鍵還是配置Jar內部的MANIFEST.MF檔案。該檔案存在於Jar包根目錄的META-INF資料夾內。主要由於指定主類(Main)的位置:
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
版本可以自己指定,預設生成是1.0。主類位置需要指定。
注意:Main-Class的冒號後,要跟一個空格。
如果你還有要依賴的Jar包,則可以配置Class-Path來指定。
Class-Path: ./ logback-core-0.9.29.jar junit-4.9.jar slf4j-api-1.6.1.jar logback-classic-0.9.29.jar hamcrest-core-1.1.jar
知道了這些,我們再開啟剛才生成的Jar檔案,你可能發現多了一些Eclipse的東西,並且主類變成了
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
也就是通過Eclipse提供的這個主類來載入的你程式。如果你不喜歡這樣,將其去掉。自己進行配置。筆者通過一個不依賴任何Jar包的小程式進行說明。
這是筆者打出Jar的內部截圖,去掉所有跟我的程式不相關的東西。MANIFEST.MF的配置也很簡單。
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
在有JRE的機器上,雙擊一樣可以執行。
注:這裡需要提一下,儘量不用用解壓軟體自帶的編輯器進行編輯,如果你編輯後發現不能執行,提示開啟jar錯誤等資訊,很可能是由於你編輯的MANIFEST.MF檔案的編碼錯誤。導致無法解析。預設是採用ANSI編碼格式的。不要改成UTF-8等。筆者被這個問題,困擾了近半個小時。
接下來說說在沒有JRE的機器上怎麼辦?最簡單的手動的辦法就是寫一個bat指令碼。並且帶一份jre在你的程式裡。
把圖中的三個檔案,放入同一個資料夾中。start.bat內容如下:
.\jre7\bin\java -jar .\run.jar
說白了就是呼叫jre中的java命令,執行指定的jar程式。 雙擊start.bat,執行成功。
如果你非要打成exe程式,筆者推薦一個工具JSmooth。簡單好用。同樣這也肯定是需要JRE指定的。關於JSmooth的教程,筆者找到了一個不錯的教學貼:http://yisufuyou.iteye.com/blog/403556 按照裡面的步驟,你一定可以成功。
說了這麼多,如果還有什麼不明白的,可以給我留言,一起討論研究。
-
PS1:預設的JRE體積實在太大,你可以考慮精簡JRE還節約空間,這部分內容,不在本文討論。另外,如果你想把你的軟體做成安裝包的形勢,可考慮InstallAnyWhere這個工具。
-
PS2:筆者研究的過程中,為了模擬沒有JRE的環境,真是百般折騰,因為筆者把所有環境變數都刪掉,還有可以執行。不知道是不是從JDK7開始,Java居然在我的System32路徑下,也放置Java.exe等程式,也就是說,不用配置Path了。jre路徑的指定,貌似也寫入了登錄檔,不過這點,筆者沒有親自證實,只是在登錄檔中簡單的搜尋了一下,僅發現了JavaFX的配置和一些其他的Java配置,沒有深入研究,不好定論。有興趣可以研究下,也麻煩告訴我一聲。