深入抛析JDK(编译JDK,阅读构建JDK代码)

注:博主是在centos7上面进行编译的.

1.jdk代码管理

openjdk源代码官网各个版本的jdk源代码在上面都有

openjdk源代码是用一个叫mercurial(轻量级分布式版本控制系统)的工具来管理源代码的

首先下载安装mercurial的源代码下载完成后解压下来进入源代码文件夹

1
2
[root@localhost opnesource]# tar -zxvf mercurial-4.6.tar.gz
[root@localhost opnesource]# cd mercurial-4.6

打开Makefile文件找到export PREFIX=/usr/local可以指定安装目录修改完成后输入make install命令开始安装.

1
[root@localhost mercurial-4.6]# make install

安装完成后输入hg version有以下信息就表示可以了

1
2
3
4
5
6
7
8
[root@localhost opensource]# hg version
分布式软件配置管理工具 - 水银 (版本 4.6)
(see https://mercurial-scm.org for more information)

Copyright (C) 2005-2018 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@localhost jdk7u-dev]#

然后用命令将openjdk源代码clone下来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[root@localhost jdk]# hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
[root@localhost jdk]# cd dk7u-dev #进入代码文件夹
[root@localhost dk7u-dev]# chmod 755 get_source.sh #进入代码文件夹授权get_source.sh文件
[root@localhost jdk7u-dev]# ./get_source.sh
# Repos: jaxp jaxws jdk hotspot
Starting on jaxp
Starting on jaxws
Starting on jdk
Starting on hotspot
# hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/hotspot hotspot
正在请求全部修改
正在增加修改集
正在增加清单
事务中止!
完成回滚
中止: stream ended unexpectedly (got 10152 bytes, expected 19512)
# exit code 255
# hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jaxp jaxp
正在请求全部修改
正在增加修改集
正在增加清单
正在增加文件改变
已增加 1138 个修改集,包含 5685 个改变,修改了 4097 个文件
new changesets 6ce5f4757bde:9af3447d957e
updating to branch default
2078 files updated, 0 files merged, 0 files removed, 0 files unresolved
# exit code 0
# hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jaxws jaxws
正在请求全部修改
正在增加修改集
正在增加清单
正在增加文件改变
事务中止!
完成回滚
中止: stream ended unexpectedly (got 14 bytes, expected 80)
# exit code 255
# hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jdk jdk
正在请求全部修改
正在增加修改集
正在增加清单
正在增加文件改变
已增加 7885 个修改集,包含 66961 个改变,修改了 22185 个文件
new changesets 37a05a11f281:70e3553d9d6e
updating to branch default
20846 files updated, 0 files merged, 0 files removed, 0 files unresolved
# exit code 0
# Repos: ./corba . ./hotspot ./jaxp ./jdk ./langtools
Starting on ./corba
Starting on .
Starting on ./hotspot
Starting on ./jaxp
Starting on ./jdk
Starting on ./langtools
# cd ./corba && hg pull -u
正在拉自 http://hg.openjdk.java.net/jdk7u/jdk7u-dev/corba
正在搜索修改
没有发现修改
# exit code 0
# cd ./hotspot && hg pull -u
正在拉自 http://hg.openjdk.java.net/jdk7u/jdk7u-dev/hotspot
正在搜索修改
没有发现修改
# exit code 0
# cd ./jaxp && hg pull -u
正在拉自 http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jaxp
正在搜索修改
没有发现修改
# exit code 0
# cd . && hg pull -u
正在拉自 http://hg.openjdk.java.net/jdk7u/jdk7u-dev
正在搜索修改
没有发现修改
# exit code 0
# cd ./langtools && hg pull -u
正在拉自 http://hg.openjdk.java.net/jdk7u/jdk7u-dev/langtools
正在搜索修改
没有发现修改
# exit code 0
# cd ./jdk && hg pull -u
正在拉自 http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jdk
正在搜索修改
没有发现修改
# exit code 0

如果发现有exit code 255应该是下载失败了,需要从新clone

1
2
[root@localhost jdk7u-dev]# hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/hotspot 
[root@localhost jdk7u-dev]# hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev/jaxws

代码确认下载完成后就可以开始编译了.

2.开始编译jdk代码

2.1 设置编译环境变量

执行下面的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
export LANG=C
export ALT_BOOTDIR=/usr/local/jdk1.7/ #设置jdk
export ALLOW_DOWNLOADS=true


export HOTSPOT_BUILD_JOBS=6
export ALT_PATALLER_COMPILE_JOBS=6


export SKIP_COMPARE_IMAGES=true
export USE_PRECOMPILED_HEADER=true
export BUILD_LANGTOOLS=true
export BUILD_HOTSPOT=true #设置是否编译HOTSPOT模块
export BUILD_JDK=true #设置是否编译JDK模块


export BUILD_JAXP=true #设置是否编译JAXP模块
export BUILD_JAXWS=true #设置是否编译JAXWS模块
export BUILD_CORBA=true #设置是否编译CORBA模块


#export SKIP_DEBUG_BUILD=false
#export SKIP_FASTDEBUG_BUILD=true


BUILD_DEPLOY=false
BUILD_INSTALL=false


export ALT_OUTPUTDIR=/root/temp/jdk7u        #输出的位置 


#export CORBA_DIST=$ALT_OUTPUTDIR/corba/dist
#export JAXP_DIST=$ALT_OUTPUTDIR/jaxp/dist
#export JAXWS_DIST=$ALT_OUTPUTDIR/jaxws/dist


unset JAVA_HOME #卸载JAVA_HOME
unset CLASSPATH #卸载CLASSPATH
unset JAVA_OPTS

2.2依赖环境安装
1
2
3
4
[root@localhost jdk7u-dev]# yum install -y ant ant-nodeps       #如果电脑上有ant可以跳过这一步
[root@localhost jdk7u-dev]# yum install -y libX11* libX*
[root@localhost jdk7u-dev]# yum install -y libXi-devel libXtst-devel libXt-devel freetype*
[root@localhost jdk7u-dev]# yum install -y alsa-lib-devel cups-devel

如果不安装这些依赖可能会报错.

2.3开始编译

上面的命令执行成功后就可以使用make命令开始编译了.

1
[root@localhost jdk7u-dev]# make

执行make报了下面这个错误

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/tools/ant/launch/Launcher : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)

这是因为设置export ALT_BOOTDIR设置的是JDK1.7的,出现这个错误是因为用高版本的的JDK编译的class放到低版本来执行才会出现这个错误

我编译的JDK是1.7所以要设置1.6的JDK才行

但是本宝宝后来想了想觉得编译1.7的版本太低了,就索性直接编译JDK1.8的吧.

2.3.1下载jdk1.8
1
[root@localhost jdk]# hg clone http://hg.openjdk.java.net/jdk8u/jdk8u-dev

下载步骤同上代码要保证都下载完成,因为这个有点不稳定可能某些模块下载失败,下载失败就手动执行命令下载.

2.3.2编译jdk1.8

cd进入1.8代码目录,而且要把环境变量的设置都执行一遍和上面2.1一样,然后授权configure文件,授权后执行configure文件,就会生成一个build文件夹等下编译的内容全部会在这个文件夹下面.

1
2
3
[root@localhost jdk]# cd jdk8u-dev
[root@localhost jdk8u-dev]# chmod +x configure
[root@localhost jdk8u-dev]# configure

最后一步执行make

1
[root@localhost jdk8u-dev]# make

这一步等时间比较长,执行完后如果没有error就表示编译成功了.

然后打开build下面的那个文件夹
image

hotspot,jaxp,corba,jaxws,jdk,langtools编译后的文件都有然后打开jdk文件夹

image

进入bin文件夹

image

java,javac,jmap,jps等java二进制文件都在然后执行./java -version

1
2
3
4
[root@localhost bin]# ./java -version
openjdk version "1.8.0-internal"
OpenJDK Runtime Environment (build 1.8.0-internal-lzq996298643_2018_08_05_10_25-b00)
OpenJDK 64-Bit Server VM (build 25.71-b00, mixed mode)

看到了版本为openjdk version “1.8.0-internal”.

本文结束 3Q YOU

本文标题:深入抛析JDK(编译JDK,阅读构建JDK代码)

文章作者:廖振钦

发布时间:2018年08月04日 - 09:08

最后更新:2018年08月05日 - 11:08

原始链接:http://qincloud.github.io/hexot/2018/08/04/深入抛析JDK-编译JDK-阅读构建JDK代码/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。