本文出自One Coder博客,轉載請務(wù)必注明出處:http://www.coderli.com/archives/runnablejar-to-exe/ 發(fā)現很多人問(wèn)如何把Jar轉成exe程序??赡苁窍腚p擊運行和隨處運行。其實(shí)這個(gè)并不難,我就簡(jiǎn)單總結幾種方法,供大家參考,關(guān)鍵還是要知其所以然。
Java程序的運行不可能脫離JRE,不管你是Jar包還是exe程序。這點(diǎn)你必須了解。那么在沒(méi)有JRE的機器上你的程序怎么跑?很簡(jiǎn)單,在你程序里帶一份JRE就行了。
先介紹集中打包的方法:
Eclipse:
最簡(jiǎn)單直接的方法,選擇你想打包的程序,右鍵export...
選擇Runnable Jar file。(即可執行的Jar包)
選擇你程序的主類(lèi),就是還有Main函數的類(lèi)。點(diǎn)Finish即可。
在你的機器上,設置好Jar文件的打開(kāi)方式(別默認用解壓縮的工具打開(kāi)就行),雙擊即可運行。
這個(gè)跟在命令行執行:
java -jar forfun.jar的效果是一樣的。
其實(shí)一個(gè)Jar能運行,關(guān)鍵還是配置Jar內部的MANIFEST.MF文件。該文件存在于Jar包根目錄的META-INF文件夾內。主要由于指定主類(lèi)(Main)的位置:
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
版本可以自己指定,默認生成是1.0。主類(lèi)位置需要指定。注意,Main-Class的冒號后,要跟一個(gè)空格。
如果你還有要依賴(lài)的Jar包,則可以配置Class-Path來(lái)指定。
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
打開(kāi)剛才生成的Jar文件,你可能發(fā)現多了一些Eclipse的東西,并且主類(lèi)變成了
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
也就是通過(guò)Eclipse提供的這個(gè)主類(lèi)來(lái)加載的你程序。如果你不喜歡這樣,將其去掉。自己進(jìn)行配置。筆者通過(guò)一個(gè)不依賴(lài)任何Jar包的小程序進(jìn)行說(shuō)明。
這是筆者打出Jar的內部截圖,去掉所有跟我的程序不相關(guān)的東西。MANIFEST.MF的配置也很簡(jiǎn)單。
Manifest-Version: 1.0
Main-Class: one.coder.jdk.JDKMain
在有JRE的機器上,雙擊一樣可以運行。
注:這里需要提一下,盡量不用用解壓軟件自帶的編輯器進(jìn)行編輯,如果你編輯后發(fā)現不能運行,提示打開(kāi)jar錯誤等信息,很可能是由于你編輯的MANIFEST.MF文件的編碼錯誤。導致無(wú)法解析。默認是采用ANSI編碼格式的。不要改成UTF-8等。筆者被這個(gè)問(wèn)題,困擾了近半個(gè)小時(shí)。
接下來(lái)說(shuō)說(shuō)在沒(méi)有JRE的機器上怎么辦?
最簡(jiǎn)單的手動(dòng)的辦法就是寫(xiě)一個(gè)bat腳本。并且帶一份jre在你的程序里。
把圖中的三個(gè)文件,放入同一個(gè)文件夾中。
start.bat內容如下:
.\jre7\bin\java -jar .\run.jar
說(shuō)白了就似乎調用jre中的java命令,執行指定的jar程序。 雙擊start.bat,執行成功。
如果你非要打成exe程序,筆者推薦一個(gè)工具JSmooth。簡(jiǎn)單好用。同樣這也肯定是需要JRE指定的。
按照里面的步驟,你一定可以成功。
說(shuō)了這么多,如果還有什么不明白的,可以給我留言,一起討論研究。
PS1:默認的JRE體積實(shí)在太大,你可以考慮精簡(jiǎn)JRE還節約空間,這部分內容,不在本文討論。另外,如果你想把你的軟件做成安裝包的形勢,可考慮InstallAnyWhere(http://www.flexerasoftware.com/products/installanywhere.htm)這個(gè)工具,會(huì )有
PS2:筆者研究的過(guò)程中,為了模擬沒(méi)有JRE的環(huán)境,真是百般折騰,因為筆者把所有環(huán)境變量都刪掉,還有可以運行。不知道是不是從JDK7開(kāi)始,Java居然在我的System32路徑下,也放置Java.exe等程序,也就是說(shuō),不用配置Path了。jre路徑的指定,貌似也寫(xiě)入了注冊表,不過(guò)這點(diǎn),筆者沒(méi)有親自證實(shí),只是在注冊表中簡(jiǎn)單的搜索了一下,僅發(fā)現了JavaFX的配置和一些其他的Java配置,沒(méi)有深入研究,不好定論。有興趣可以研究下,也麻煩告訴我一聲。