前言
Write Once,Run Anywhere,一次编写,到处运行,咱们再相熟不过了,只管都晓得 Java 源码要先通过 javac 编译为字节码文件,而后由 JVM 去运行,然而有些选手就想把他编译成为 exe,当然这也是能够的,尽管我还没有正真的尝试过,然而做到这样也很简略,原理就是把 jre 和 jar 一起打包,寄存在 exe 文件中,而后运行 exe 的时候,开释 jre 和 jar 文件,接着就能够调用 java -jar
去执行这个 jar 包,然而这样做的话,最终的 exe 体积就会变的十分大,并且没有脱离 JVM 环境。
那还有没有其余方法,当然有了,就是通过 GCJ,全称叫 GNU Compiler for the Java Programming Language,这个编译器能够间接将 java 文件编译为本地机器指令,这样的话 Java 程序就脱离了 JVM 环境独立运行,还能够将 java 文件编译为字节码文件,GCJ 的实现尽管不残缺,然而,他反对大多数的 Java 性能,包含汇合,网络,反射,序列化,JNI 和 RMI。
GCJ
装置
上面以 Linux 为例,装置命令如下:
sudo apt-get install gcj-jdk
生成可执行文件
在编写一个 Java Hello World 文件:
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 在更具这个对象文件进行链接,生成一个可执行文件。
其实也能够通过一条命令来实现编译和链接,命令如下:
gcj --main=Test -o Test Test.java
–main=Test 是通知链接用哪一个类的 main()办法做为可执行文件的入口。
而后运行:
./Test
HelloWorld
是不是惊呆了呢?然而最终大小还是有点大,16.1KB。
生成 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 编译器就无能为力。