Windows10下编译openjdk8

缘起

java程序员经常说new 一个对象,后台线程啥的,而且面试经常被问及JVM,其实感觉java就像是c/c++上建筑的高塔. 总有一种不踏实的感觉——我就是这么的喜欢底层. 哈哈, 所以准备在Windows10上编译一套自己的jdk源码来玩玩. 真实的看到java到底是怎么运行的,对象究竟是个什么样的存在?

分析

首先,我们说一下为什么要在自己的机器上编译jdk源码而不能在CSDN上下一个别人已经编译好的. 编译过Hadoop源码的话,就知道,涉及到c/c++一套的东西就不能跨平台, 必须要依赖本地机器的环境. 所以你下载别人的机器上编译好的未必能在自己的机器上跑起来的. 其次,就算能跑起来,也未必能和你下载的源码对应的上. 注意,所谓debug其实是这么一回事,就是你有一套源码以及这套源码编译出来的可执行的东西,然后把你这套可执行的东西跑起来,而这套可执行的东西和源码的行号已经对应了的(编译的时候已经生成了这个信息), 则就可以愉快的断点debug了.

废话不多说,上干货.

环境

  1. Windows10 HomeBasic
  2. Boot JDK 是 jdk8,有人网上说要删掉 JAVA_HOME和CLASSPATH这两个环境变量,但其实不用.
  3. openjdk8源码, 这个可以到官网上去下
  4. freeType-2.7.tar.gz
  5. cygwin64

安装cygwin64

cygwin就好比是在Windows上运行的一台linux虚拟机.

从网上下载cygwin64之后

我们选择了香港的代理服务器.

cygwin64需要安装的包有(但实际上装的时候和下图有出入,以后续实际装的为准)

下面开始实际装

上面安装的cygwin64的包可能和网上一些文章不一样,但是我就是这么装的,并且装成了。注意,不要选择All install(如下图)

不然的话,要花费好久下载(20+G,想想自己弱小的带宽,还是算了吧).

安装完毕cygwin64之后,将其写入path变量

安装过程中,会在下面的Running阶段卡住较久(五到十分钟,卡住的时间与你安装的包的数量成正比)——你只需要等待,不要烦躁

安装vs2010

选用vs2010的原因就在于官方推荐~,别用其他的vs版本,很多坑~. 至于vs2010的安装,别的没什么, 但是千万注意——安装路径不要有空格!!!,不要有空格!!!,不要有空格!!!

否则,最后make all 的时候会报

1
GensrcSwing.gmk:79

这样一个Stack Overflow都搜不到的问题. 当时绝望的要死~ 狠下心,重新安装了vs2010. 我装在了 D:\vs2010下面.

ps: 我们并不是使用vs2010编译的openjdk8, 编译openjdk8 的显然是cygwin的gcc. 因为我们在cygwin64中执行的make all, 唯一和vs2010有关系的是我们用vs2010编译了freetype2.7的源码

安装FreeType

需要该软件的原因:这是一个免费的字体渲染库,JDK的Swing部分和JConsole这类工具使用到。

下载之后,解压之后放在 D:\freetype-2.7

然后使用vs2010打开freetype.sln

然后下面要做的事情就是将这个freetype编译成freetype.lib(静态链接库)和freeetype.dll(动态链接库).

右键项目选择Properties, 或者Alt+Enter 快捷键.

编译成freetype.lib 的方法

点击右上角的Configuration Manager

然后就可以将freetype编译为freetype.lib了, 即像下面这个样子(点击Build)

编译成freetype.dll 的方法

同样右键项目,选择Properties之后

然后直接点击确定(不需要进入Configuration Manager),

然后右键项目点击Build即可.

得到的freetype.lib 和 freetype.dll 出现在 D:\freetype-2.7\objs\vc2010\x64

然后创建 D:\freetype-2.7\lib文件夹之后(刚开始是没有这个目录的)将这两个文件放进去,即

然后设置两个环境变量并写入path

编译openjdk之前的编译选项&检查

打开cygwin,切换到解压的openjdk_8的文件夹根目录(d/openjdk-8u40-src-b25-10_feb_2015/openjdk是我的openjdk的根目录)

1
2
3
4
5
6
7
8
yfs@LAPTOP-DSJV96RJ ~
$ cd d:

yfs@LAPTOP-DSJV96RJ /cygdrive/d
$ cd openjdk-8u40-src-b25-10_feb_2015/openjdk/

yfs@LAPTOP-DSJV96RJ /cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk
$

执行预编译&检查命令

1
bash ./configure -with-freetype=/cygdrive/d/freetype-2.7 -enable-debug -with-target-bits=64 -disable-ccache

ps: 如果不加 -disable-ccache的话,会报下面的错误

1
CoreLibraries.gmk:37错误

经过一段时间的等待,如果看到下面的

则说明编译检查通过.

编译openjdk

执行make all

1
2
yfs@LAPTOP-DSJV96RJ /cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk
$ make all

则祈祷吧~ 希望不会报错.

可能遇到的坑

很少有人可以一遍成功的, 下面我仅仅列出自己编译的过程中遇到的坑. 其余坑请参考网上他人的文章.

Your cygwin is too old

这是由于openjdk的检查脚本的写死了cygwin的版本这个bug导致的.

解决方法是修改

D:\openjdk-8u40-src-b25-10_feb_2015\openjdk\common\autoconf\generated-configure.sh

的7249行,或者文本搜索

1
CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION

1
CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^1.7.`

改成

1
CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^3.0.`
BuildJdk.gmk:101
1
2
3
4
make[2]: *** [CreateJars.gmk:268:/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk/build/windows-x86_64-normal-server-fastdebug/images/lib/_the.rt.jar.contents] 错误 1
make[2]: *** 正在等待未完成的任务....
make[1]: *** [BuildJdk.gmk:101:images] 错误 2
make: *** [/cygdrive/d/openjdk-8u40-src-b25-10_feb_2015/openjdk//make/Main.gmk:136:images-only] 错误 2

原因是因为坑爹的Windows和linux换行符不一致导致的.

找到 D:\openjdk-8u40-src-b25-10_feb_2015\openjdk\jdk\make\CreateJars.gmk, 使用cmd的vi工具(Windows的cmd中也有vi工具了, 然后 按下 冒号, set number 将行号调出来,然后268gg 按下,直接跳到268行,然后在下面的两个白框框处Ctrl+V 然后马上按下M, 然后Esc, wq保存退出即可.)

BuildJdk.gmk:70
1
2
3
make[1]: *** [BuildJdk.gmk:70:libs-only] 错误 2

make: *** [/cygdrive/e/hub/openjdk/jdk8u//make/Main.gmk:116:jdk-only] 错误 2

只需要 make clean 然后重新 make all 即可.