Java虚拟机学习笔记-记录一次编译OpenJDK8与调试的过程

写在前面

  最近意识到,要想在技术的路上走的更远,只是摆弄一些框架是远远不够的,所以前几天趁着618活动,从京东买了一堆基础的书籍。其中,包括一本《深入理解Java虚拟机:JVM高级特性与最佳实践》,网上各路大牛都极力推荐的一本书。书到手后,粗略翻了翻,的确是一本好书,我觉得学习完这一本书,可以弥补自己在这方面的不足,而且在以后的笔试面试中也不怕有关Java虚拟机部分的问题了。书的第一章就是编译openjdk7和添加到Netbeans中调试,我在这里折腾了很久,首先按照书上说的下载源码包,配置环境编译,结果错误有很多,原因应该就是有点过于古老。之后我又按照网上的教程编译,编译过openjdk7和openjdk8,虚拟机删了重装了好多次,依然失败。最后,直接决定在自己的物理机上进行编译,一步一步的通过阅读英文的官方文档进行操作,最终才得以成功。


OpenJDK8 与 OpenJDK7比较


  我硬着头皮看这些的时候,以我垃圾的英语水平都可以明显看到,一些东西不被支持了,比如AntALT_*的环境变量。可是在我查看的多数编译OpenJDK8的文章中,在一开始就装了Ant,配置的变量也有ALT_*。看到这里,我就觉的要好好学英语了,哈哈。


基础环境

  • 操作系统:Deepin Linux 15.4 桌面版 (应该Ubuntu 16.04也是可以的)
  • Bootstrap JDK:JDK 7 (Bootstrap JDK要比要编译的版本低一个版本,所以这里使用JDK 7,使用Oracle的就可以,没必要使用OpenJDK 7)
  • 调试IDE:NetBeans IDE 8.2 (下载All版本就可以)

获取源码包

  获取源码包一共有两种方式,第一种是通过Mercurial获取,可能还得用梯子,但是强烈推荐用这个,并且下载开发分支。第二种就是直接下载源码包,打开这里下载
  我使用的是第一种,我是搭了梯子才下载下来的,而且下载的是开发分支。使用第一种方式就是为了能够下载开发分支,是因为在第二种的源码包中,还存在很多BUG,自己需要一一解决,而最新的开发包中,官方已经解决了一些大部分人都会碰到的BUG,所以,能用第一种就用第一种方式下载。
  Deepin下直接使用如下命令就可以安装MercurialUbuntu可能还需要添加PPA源,这个一百度都有。

1
sudo apt-get install mercurial

之后使用如下命令下载源码包:

1
2
3
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev/ openjdk8-dev
cd openjdk8-dev
bash ./get_source.sh

  出错的话,再次运行最后的命令就可以,最好搭个梯子。一直到全部下载完成。我这边下载完差不多700多MB。


环境变量配置

  配置之前,请先保证系统中是否自带了OpenJDK,有就直接卸载掉,或者你之前配置了Java的环境变量的话要注释掉,然后用source命令或者重启使修改生效。
  然后在命令行下执行如下命令,之后的编译也要在当前的命令行窗口进行,因为下面命令配置的环境变量,在另一个命令行窗口中就会失效。

1
2
3
4
5
6
export LANG=C
# 更改为自己本地的JDK路径,这个就是配置的Bootstrap JDK
export PATH="/usr/local/java/jdk1.7.0_80/bin:${PATH}"
# 下面这两句是我出现错误的时候,在国外的一个网站找到的解决方案
export CFLAGS="$CFLAGS -Wno-deprecated-declarations"
export CXXFLAGS="$CXXFLAGS -Wno-deprecated-declarations"


编译

  首先执行如下命令:

1
bash ./configure --enable-debug --with-target-bits=64

  第一次肯定不会直接通过,是因为依赖还没有安装,这个时候就重复执行该命令,最后会提示你安装依赖,直到成功。成功之后,再执行如下命令:

1
make all

  没错误的话,就进入build/linux-x86_64-normal-server-fastdebug/images/j2sdk-image/bin,执行./java -version,就会输出版本信息,其中还包括你的名字。我这里名字不知道为什么少个w,很不理解。


简单调试

  书上的这个地方很复杂,我上网查了资料,发现OpenJDK8直接就提供了一个项目,不用我们自己新建,直接在NetBeans中打开就可以了,项目的路径是OpenJdk根目录下的common/nb_native。我第一次打开的时候,需要设置一个什么环境变量,我直接设置的上面JDK7的路径。在进行编译之前,这里要修改为Linux_64

  接下来,F11应该就可以执行编译了。具体的调试在之后的学习中,需要记录的,都要记录下来,留给1个月后的自己看。


小结

  记录一下深入Java虚拟机的第一课,方便日后查看。以后要静下心来阅读英文文档,好好的学习英语,好好学习基础,争取在技术这条路上走的越来越远。


参考资料

Author: HowieLi
Link: https://www.howieli.cn/posts/build-debug-openjdk8-from-deepin.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.