Write Once,Run Anywhere,一次編寫,處處運行,咱們再熟悉不過了,儘管都知道Java源碼要先經過javac編譯爲字節碼文件,而後由JVM去運行,可是有些選手就想把他編譯成爲exe,固然這也是能夠的,雖然我尚未正真的嘗試過,可是作到這樣也很簡單,原理就是把jre和jar一塊兒打包,存放在exe文件中,而後運行exe的時候,釋放jre和jar文件,接着就能夠調用java -jar
去執行這個jar包,可是這樣作的話,最終的exe體積就會變的很是大,而且沒有脫離JVM環境。java
那還有沒有其餘辦法,固然有了,就是經過GCJ,全稱叫GNU Compiler for the Java Programming Language,這個編譯器能夠直接將java文件編譯爲本地機器指令,這樣的話Java程序就脫離了JVM環境獨立運行,還能夠將java文件編譯爲字節碼文件,GCJ的實現雖然不完整,可是,他支持大多數的Java功能,包括集合,網絡,反射,序列化,JNI和RMI。網絡
下面以Linux爲例,安裝命令以下:spa
sudo apt-get install gcj-jdk
在編寫一個Java Hello World文件:code
public class Test { public static void main(String... a) { System.out.println("HelloWorld"); } }
下面分爲兩步,編譯和連接,命令以下:對象
gcj -c Test.java #編譯爲Hello.o gcj --main=Test -o Test Test.o ##將Hello.o連接到Hello
GCJ編譯器首先會更具java源碼編譯出一個後綴爲.o的對象文件,這個文件的內容就是能夠直接被CPU識別執行的本地機器指令,而後GCJ在更具這個對象文件進行連接,生成一個可執行文件。rem
其實也能夠經過一條命令來完成編譯和連接,命令以下:get
gcj --main=Test -o Test Test.java
--main=Test是告訴連接用哪個類的main()方法作爲可執行文件的入口。編譯器
而後運行:源碼
./Test HelloWorld
是否是驚呆了呢?可是最終大小仍是有點大,16.1KB。it
-C 參數用來告訴GCJ編譯成Java字節碼文件,即生成一個class文件,運行的話就能夠經過java命令來運行。
gcj -C Test.java java Test HelloWorld
要把jar編譯爲可執行文件,首先就要經過IDE把項目打包成一個jar包,或者經過jar命令也能夠,而後在進行編譯和連接便可。
jar cvf Test.jar *.class gcj -c Test.jar gcj --main=Test -o Test Test.o ./Test
雖然GCJ能把java源碼編譯爲本地機器指令,可是貌似也沒有多少人會這樣作,首先體積也會變大,再者就是GCJ編譯器默認只會對Java的基礎類庫提供支持,其餘第三方GCJ編譯器就無能爲力。