【深入理解Java虚拟机】之自己编译JDK
2017-07-04 15:25
435 查看
转载请注明:http://blog.csdn.net/u013190088/article/details/71703255
系统:CentOS 6.5
OpenJDK:OpenJDK 7u
1、获取源码。
两种方式:
① 直接官网下载
② 通过Mercurial代码版本管理工具获取。
说一下第二种方式:
首先安装Mercurial代码版本管理工具
安装之后clone源码
2
3
4
2、构建编译环境
需要准备一个6u14以上版本的JDK,以为OpenJDK的各个组成部分(Hotspot ,JDK API, JAXWS, JAXP…..)有的是使用C++编写的,更多的代码则是使用Java自身实现的,因此编译这些Java代码需要用到一个可用的JDK(Booststrap JDK)。
安装环境:
3 进行编译
需要对系统环境变量进行一些简单设置。OpenJDK在编译时读取的环境变量有很多,但大多都有默认值,必须设置的只有两个:LANG和ALT_BOOTDIR。
前者必须设置为:
否则,在编译结束前的验证阶段会出现一个HashTable内的空指针异常。
另外一个ALT_BOOTDIR参数是前面提到的Booststrap JDK(最好不要用JDK1.8,否则后面编译的时候会报错!!!!见错误4)。
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
make的时候会报错:
错误1:
2
3
4
5
6
7
解决办法:
错误2:
解决办法:
2
3
4
错误3:
解决办法:
此时make sanity提示通过。 可是make的时候还是报错:
错误4:
2
3
4
解决办法:
2
make之后过了一阵时间没报错,以为成功了~~~又继续报错:
错误5:
2
3
4
5
6
7
8
9
10
11
12
13
解决办法:
错误6:
2
3
解决办法:
2
错误7:
解决办法:
2
3
4
5
6
7
8
错误8:
2
3
4
5
6
7
8
9
10
11
解决办法:
2
错误9:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
解决办法:
终于编译好了!!!!
2
3
4
5
6
7
8
9
10
11
12
经过半天努力,终于搞出来了,测试一下:
2
3
4
5
6
7
8
9
10
11
12
运行虚拟机:
在product下边(看网上都是在jvmg下边,可我的jvmg下边没有gamma,不知道什么情况)的env.sh下加入:
2
3
使生效env.sh
2
如果报错:
2
3
4
5
6
7
8
最后运行虚拟机成功!!
系统:CentOS 6.5
OpenJDK:OpenJDK 7u
1、获取源码。
两种方式:
① 直接官网下载
② 通过Mercurial代码版本管理工具获取。
说一下第二种方式:
首先安装Mercurial代码版本管理工具
yum install mercurial1
安装之后clone源码
hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev cd jdk7u-dev chmod 755 get_source.sh ./get_source.sh1
2
3
4
2、构建编译环境
需要准备一个6u14以上版本的JDK,以为OpenJDK的各个组成部分(Hotspot ,JDK API, JAXWS, JAXP…..)有的是使用C++编写的,更多的代码则是使用Java自身实现的,因此编译这些Java代码需要用到一个可用的JDK(Booststrap JDK)。
安装环境:
yum install build-essential gawk m4 openjdk-6-jdk libasound2-dev libcups2-dev libxrender-dev xorg-dev xutils-dev xllproto-print-dev binutils libmotif3 libmotif-dev ant1
3 进行编译
需要对系统环境变量进行一些简单设置。OpenJDK在编译时读取的环境变量有很多,但大多都有默认值,必须设置的只有两个:LANG和ALT_BOOTDIR。
前者必须设置为:
export LANG=C1
否则,在编译结束前的验证阶段会出现一个HashTable内的空指针异常。
另外一个ALT_BOOTDIR参数是前面提到的Booststrap JDK(最好不要用JDK1.8,否则后面编译的时候会报错!!!!见错误4)。
ALT_BOOTDIR=/usr/local/java/jdk1.8.0_1011
#语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错 export LANG=C #Bootstrap JDK的安装路径。必须设置 export ALT_BOOTDIR=/usr/local/java/jdk1.8.0_101 #允许自动下载依赖 export ALLOW_DOWNLOADS=true #并行编译的线程数,设置为和CPU内核数量一致即可 export HOTSPOT_BUILD_J0BS=6 export ALT_PARALLEL_COMPILE_JOBS=6 #比较本次build出来的映像与先前版本的差异。这对我们来说没有意义, #必须设置为false,香则sanity检查会报缺少先前版本JDK的映像的错误提示。 #如桌已经设置dev或者DEV_ONLY=true,这个不显式设置也行 export SKIP_COMPARE_IMAGES=true #使用预编译头文件,不加这个编译会更慢一些 export USE_PRECOMPILED_HEADER=true #要编译的内容 export BUILD_LANGTOOLS=true #export BUILD_JAXP=false #export BUILD_JAXWS=fa1se #export BUILD_CORBA=false export BUILD_HOTSPOT=true export BUILD_JDK=true #要编译的版本 #export SKIP_DEBUG_BUILD=false #export SKIP_FASTDEBUG_BUILD=true #export DEBUG_NAME=debug #把它设置为false可以避开javaws和浏览器Java插件之类的部分的build BUILD_DEPLOY=false #把它设置为false就不会build出安装包。因为安装包里有些奇怪的依赖, #但即便不build出它也已经能得到完整的JDK映像,所以还是别build它好了 BUILD_INSTALL=false #编译结果所存放的路径 export ALT_OUTPUTDIR=/home/openjdk/jdk7u-dev/build #这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些 "诡异的 #事情” ,Makefile脚本裣查到有这2个变量就会提示警告) unset JAVA_HOME unset CLASSPATH make 2>&1 | tee $ALT_OUTPUTDIR/build.log1
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
make的时候会报错:
错误1:
ERROR: You do not have access to valid Cups header files. Please check your access to /usr/include/cups/cups.h and/or check your value of ALT_CUPS_HEADERS_PATH, CUPS is frequently pre-installed on many systems, or may be downloaded from http://www.cups.org1
2
3
4
5
6
7
解决办法:
sudo yum install cups-devel.x86_641
错误2:
You seem to not have installed ALSA 0.9.1 or higher.1
解决办法:
sudo yum install alsa-lib-devel UBUNTU下: sudo apt-get install libasound2-dev1
2
3
4
错误3:
ERROR: FreeType version 2.3.0 or higher is required.1
解决办法:
sudo yum install freetype-devel1
此时make sanity提示通过。 可是make的时候还是报错:
错误4:
BUILD FAILED /home/openjdk/jdk7u-dev/langtools/make/build.xml:452: The following error occurred while executing this line: /home/openjdk/jdk7u-dev/langtools/make/build.xml:795: Compile failed; see the compiler error output for details.1
2
3
4
解决办法:
更换ORACLE JDK版本 我换成了JDK1.7(之前为JDK1.8) export ALT_BOOTDIR=/home/openjdk/Downloads/jdk1.7.0_80/1
2
make之后过了一阵时间没报错,以为成功了~~~又继续报错:
错误5:
BUILD FAILED /home/openjdk/jdk7u-dev/jaxp/build.xml:105: Problem: failed to create task or type replaceregexp Cause: the class org.apache.tools.ant.taskdefs.optional.ReplaceRegExp was not found. This looks like one of Ant's optional components. Action: Check that the appropriate optional JAR exists in -/usr/share/ant/lib -/home/openjdk/.ant/lib -a directory added on the command line with the -lib argument Do not panic, this is a common problem. The commonest cause is a missing JAR. This is not a bug; it is a configuration problem1
2
3
4
5
6
7
8
9
10
11
12
13
解决办法:
sudo yum install ant*1
错误6:
/usr/bin/ld: cannot find -lX11 collect2: ld returned 1 exit status1
2
3
解决办法:
sudo yum install libX11-devel (找不到其他库文件一样的解决办法,安装对应的库文件即可)1
2
错误7:
make[5]: *** Waiting for unfinished jobs....1
解决办法:
安装libxt-dev,不过yum源好像没有这包~ rpm下载地址 ftp://195.220.108.108/linux/centos/6.8/os/x86_64/Packages/libXt-devel-1.1.4-6.1.el6.x86_64.rpm 下载后sudo rpm -ivh ****.rpm安装即可 如果rpm安装提示pkgconfig(sm) is needed by .... 安装libSM-devel即可(sudo yum install libSM-devel)1
2
3
4
5
6
7
8
错误8:
make[5]: Leaving directory `/home/openjdk/jdk7u-dev/jdk/make/sun/splashscreen' make[4]: *** [library_parallel_compile] Error 2 make[4]: Leaving directory `/home/openjdk/jdk7u-dev/jdk/make/sun/splashscreen' make[3]: *** [all] Error 1 make[3]: Leaving directory `/home/openjdk/jdk7u-dev/jdk/make/sun' make[2]: *** [all] Error 1 make[2]: Leaving directory `/home/openjdk/jdk7u-dev/jdk/make' make[1]: *** [jdk-build] Error 2 make[1]: Leaving directory `/home/openjdk/jdk7u-dev' make: *** [build_product_image] Error 21
2
3
4
5
6
7
8
9
10
11
解决办法:
sudo yum install libXtst-devel1
2
错误9:
/home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:74: error: (Each undeclared identifier is reported only once /home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:74: error: for each function it appears in.) /home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:74: error: expected ';' before 'temp20' /home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:138: error: 'XRenderPictFormat' undeclared (first use in this function) /home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:138: error: expected ';' before 'temp52' /home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:438: error: 'temp20' undeclared (first use in this function) /home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:701: error: 'temp52' undeclared (first use in this function) /home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64.c:1252: error: 'AwtGraphicsConfigData' has no member named 'renderPictFormat' make[4]: *** [/home/openjdk/jdk7u-dev/build/gensrc/sun/awt/X11/generator/sizer.64] Error 1 make[4]: Leaving directory `/home/openjdk/jdk7u-dev/jdk/make/sun/xawt' make[3]: *** [all] Error 1 make[3]: Leaving directory `/home/openjdk/jdk7u-dev/jdk/make/sun' make[2]: *** [all] Error 1 make[2]: Leaving directory `/home/openjdk/jdk7u-dev/jdk/make' make[1]: *** [jdk-build] Error 2 make[1]: Leaving directory `/home/openjdk/jdk7u-dev' make: *** [build_product_image] Error 21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
解决办法:
sudo yum -y install libX*1
终于编译好了!!!!
#-- Build times ---------- Target all_product_build Start 2017-05-13 15:37:57 End 2017-05-13 15:43:07 00:00:08 corba 00:00:06 hotspot 00:00:02 jaxp 00:00:02 jaxws 00:04:51 jdk 00:00:01 langtools 00:05:10 TOTAL1
2
3
4
5
6
7
8
9
10
11
12
经过半天努力,终于搞出来了,测试一下:
[openjdk@hadoop j2sdk-image]$ pwd /home/openjdk/jdk7u-dev/build/j2sdk-image [openjdk@hadoop j2sdk-image]$ export JAVA_HOME=/home/openjdk/jdk7u-dev/build/j2sdk-image [openjdk@hadoop j2sdk-image]$ export PATH=$PATH:$JAVA_HOME/bin [openjdk@hadoop j2sdk-image]$ java -version java version "1.7.0_141" OpenJDK Runtime Environment (rhel-2.6.10.1.el6_9-x86_64 u141-b02) OpenJDK 64-Bit Server VM (build 24.141-b02, mixed mode)1
2
3
4
5
6
7
8
9
10
11
12
运行虚拟机:
在product下边(看网上都是在jvmg下边,可我的jvmg下边没有gamma,不知道什么情况)的env.sh下加入:
LD_LIBRARY_PATH=.:${JAVA_HOME}/jre/lib/amd64/native_threads:${JAVA_HOME}/jre/lib/amd64: export LD_LIBRARY_PATH1
2
3
使生效env.sh
source ./env.sh ./gamma -version1
2
如果报错:
./gamma: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory 网上解法: 可以发现,其实在当前目录(也就是jvmg目录)就有对应的libjvm.so ,所以,修改 /etc/ld.so.conf 文件,把当前目录加进去。具体如下 写道 [zhenghui@localhost linux_amd64_compiler2]$ cat /etc/ld.so.conf include ld.so.conf.d/*.conf /home/zhenghui/software/openjdk/build/linux_amd64_compiler2/jvmg1
2
3
4
5
6
7
8
最后运行虚拟机成功!!
[openjdk@hadoop product]$ ./gamma -version Using java runtime at: /home/openjdk/jdk7u-dev/build/j2sdk-image/jre openjdk version "1.7.0-internal" OpenJDK Runtime Environment (build 1.7.0-internal-openjdk_2017_05_13_11_17-b00) OpenJDK 64-Bit Server VM (build 24.80-b07, mixed mode) [openjdk@hadoop product]$
相关文章推荐
- 【深入理解Java虚拟机】之自己编译JDK(已经完成,其中有自己遇到的各种问题及解决办法)
- [深入理解Java虚拟机]第一章实战 自己编译JDK
- 深入理解Java虚拟机 自己编译JDK
- [深入理解Java虚拟机]第十一章 程序编译与代码优化-晚期(运行期)优化
- 深入理解java虚拟机 摘要(八)--JDK的可视化工具
- 深入理解Java虚拟机----(九)程序编译和代码优化
- 深入理解Java虚拟机---(2)JDK、JRE、JVM的联系与区别
- [深入理解Java虚拟机]第十章 程序编译与代码优化-早期(编译期)优化
- [深入理解JAVA虚拟机-JDK1.7]-[调优案例分析]-1[高性能硬件部署]
- 学习【深入理解java虚拟机】二:条件编译
- 【转】C RunTime Library 暨 深入理解编译选项的含义 - 04
- 【转】C RunTime Library 暨 深入理解编译选项的含义 - 01
- 深入理解include预编译原理
- 【转】C RunTime Library 暨 深入理解编译选项的含义 - 05(完)
- 深入理解软件包的配置、编译与安装
- 深入理解include预编译原理
- 深入理解软件包的配置、编译与安装
- 深入理解Linux软件包的配置、编译与安装
- 深入理解软件包的配置、编译与安装
- [金步国]深入理解软件包的配置、编译与安装