小夥伴驚呆了!這個編譯器能夠直接將Java源碼編譯爲本地機器指令

前言

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。網絡

GCJ

安裝

下面以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

生成java字節碼文件

-C 參數用來告訴GCJ編譯成Java字節碼文件,即生成一個class文件,運行的話就能夠經過java命令來運行。

gcj -C Test.java 

java Test 

HelloWorld

編譯Jar

要把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編譯器就無能爲力。

相關文章
相關標籤/搜索