小伙伴惊呆了!这个编译器能够直接将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编译器就无能为力。

相关文章
相关标签/搜索