作为一位程序员,我坚信了解一件事物的最佳方式是深入到它的最底层去研究其运行的原理。既然我大部分时间都在写Java代码,那么就肯定需要了解JVM的运行原理。所以上周尝试了编译了一下JVM的开源实现:OpenJDK。

准备工作

在开始编译之前,首先需要一些准备工作:

  • 操作系统:建议在2.x内核的Linux系统上编译,在Windows下编译的话还要装CYGWIN,比较麻烦,如果你在3.0以上内核版本的Linux下编译,首先你会遇到一个This OS is not supported的错误,然后即使你在编译的时候加上了DISABLE_HOTSPOT_OS_VERSION_CHECK=ok这个选项,你可能会遇到一些宏定义找不到之类的编译错误。
  • 源代码:编译OpenJDK当然需要OpenJDK的源代码,可以从这里下载
  • 依赖:编译OpenJDK所需的东西在下载过来的源代码包里面的README_builds.html中都有列出,这里列出一些大概的依赖,具体所需的版本可以在README_builds.html中找到:OpenJDK(是的,编译OpenJDK需要一个OpenJDK,有点鸡生蛋,蛋生鸡的感觉),make,g++,ant,axel(Linux声音相关),X11(图形相关,编译awt的时候需要),freetype2(字体相关)等
  • 环境变量:编译以前请先分别设置语言和编译所需的OpenJDK的路径:

1

export LANG=C ALT_BOOTDIR=/usr/lib/jvm/java-openjdk

编译

安装好所需的依赖以后,可以用以下命令检查一下依赖是否都已经正确安装了:

1

make sanity

如果输出没有错误,则可以用一下命令编译:

1

make ALLOW_DOWNLOADS=true

加上ALLOW_DOWNLOADS=true的原因是编译过程中ant可能会需要下载一些东西,如果你要编译一个DEBUG版本,则可以用以下命令

1

make debug_build ALLOW_DOWNLOADS=true

遇到的问题

我在编译过程还是遇到了不少问题,首先在Ubuntu 11.10下编译,遇到了前面提到的Linux内核3.0的问题,后来改到在CentOS 6下编译。

在CentOS下编译首先遇到了一个ant的一个类找不到的问题(在一个叫optional的package下),后来看了一下我直接用yum install安装的ant默认并没有安装一些optional的包,后来又用yum install安装了那个类对应的包,算是解决了这个错误。如果读者是直接在ant的官方网站下载安装应该不会有这个问题。

再之后就是在编译过程中遇到了很多缺少X11的头文件的错误,幸好发现yum有yum provides这个命令可以找到头文件所在的包,然后用yum install安装。(:-),一直在Ubuntu下用apt-get的孩子伤不起啊~~)

整个编译过程大概需要1个多小时(AMD速龙3800,2G RAM,单Job),这个期间可以搞点下午茶吃吃,搞部小电影看看~~

最后感谢下方攀同学在过程中提供的帮助,^_^