自己编译JDK

自己编译JDK

文章目录

  • 自己编译JDK
    • 前言
    • 准备
      • 操作系统
      • 源码
      • Bootstrap JDK
      • 需要安装的库
      • 环境变量设置和执行编译(参照《深入理解Java虚拟机》)
    • 遇到的错误和解决办法
    • 编译成功
    • 参考链接

前言

买了《深入理解JAVA虚拟机 JVM高级特性与最佳实践》(周志明,第二版),作者在第一章作了一些介绍后就提出:

想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原型。虽然门槛会高一点,但肯定比阅读各种书籍、文章更加贴近本质。另外,JDK中的很多底层方法都是本地化(Native)的,需要跟踪这些方法的运作或对JDK进行Hack的时候,都需要自己编译一套JDK。

准备

操作系统

作者说Windows,Linux,Mac都可以,但Windows会麻烦一些,而我目前没有Mac,所以我选择在笔记本上安装的双系统中的Centos7上执行。

源码

两种方式获取源码,一个是用Mercurial在Repository中获取:

hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
cd jdk7u-dev
chmod 755
get_source.sh

我采用的就是这一方式,但速度比较慢,全部下载到本地需要数个小时的时间。

第二个方式是到自己到网站上去下载,作者给出的网址如下:

http://jdk7.java.net/source.html

但似乎页面已经变化,不提供下载了。我在OpenJDK中只找到jdk1.6的源码:
https://download.java.net/openjdk/jdk6
通过修改链接虽然也能找到jdk7的源码下载页面,但这一下载途径似乎已经被禁止了。
自己编译JDK_第1张图片

Bootstrap JDK

由于Openjdk7和Oracle jdk8都会报错,我选择安装Oracle jdk7。
详细可以参考下面的链接1。

需要安装的库

yum groupinstall “Development Tools”
yum install alsa-lib-devel cups-devel freetype-devel libXi-devel gcc gcc-c++ libX* ant
这里我参照了下面的链接2和3,具体需要哪些我也不太清楚。

环境变量设置和执行编译(参照《深入理解Java虚拟机》)

[rhzhou@localhost jdk7u-dev]$ cat set_env.sh 
#语言选项,这个必须设置,不然编译好后会出现一个HashTable的NPE错误
export LANG=C

#Bootstrap JDK的安装路径。必须设置
export ALT_BOOTDIR=/usr/java/jdk1.7.0_80

#允许自动下载依赖
export ALLOW_DOWNLOADS=true

#并行编译的线程数
export HOTSPOT_BUILD_JOBS=6
export ALT_PARALLEL_COMPILE_JOBS=6

export SKIP_COMPARE_IMAGES=true

export USE_PRECOMPILED_HEADER=true

export BUILD_LANGTOOLS=true
#export BUILD_JAXP=false
#export BUILD_JAXWS=false
#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

BUILD_DEPLOY=false

BUILD_INSTALL=false

export ALT_OUTPUTDIR=/home/rhzhou/openjdk/JVM/openjdk_7u4/build

unset JAVA_HOME
unset CLASSPATH

make 2>&1 | tee $ALT_OUTPUTDIR/build.log

遇到的错误和解决办法

1.ERROR: Cannot chcon libjvm.so

make[6]: Entering directory `/home/rhzhou/openjdk/JVM/openjdk_7u4/build/hotspot/outputdir/linux_amd64_compiler2/product'
make[6]: stat: libjvm.so: Too many levels of symbolic links
.....................................................
Linking vm...
echo "**NOTICE** Dtrace support disabled: "/usr/include/sys/sdt.h not found""
**NOTICE** Dtrace support disabled: /usr/include/sys/sdt.h not found
/usr/bin/ld: cannot open output file libjvm.so: Too many levels of symbolic links
collect2: error: ld returned 1 exit status
ln: failed to access 'libjvm.so': Too many levels of symbolic links
ln: failed to access 'libjvm.so.1': Too many levels of symbolic links
/usr/bin/chcon: failed to get security context of 'libjvm.so': Too many levels of symbolic links
ERROR: Cannot chcon libjvm.so
/usr/bin/objcopy --only-keep-debug libjvm.so libjvm.debuginfo
/usr/bin/objcopy: Warning: could not locate 'libjvm.so'.  reason: Too many levels of symbolic links
make[6]: *** [libjvm.so] Error 1
make[6]: Leaving directory `/home/rhzhou/openjdk/JVM/openjdk_7u4/build/hotspot/outputdir/linux_amd64_compiler2/product'
make[5]: *** [the_vm] Error 2
make[5]: Leaving directory `/home/rhzhou/openjdk/JVM/openjdk_7u4/build/hotspot/outputdir/linux_amd64_compiler2/product'
make[4]: *** [product] Error 2
make[4]: Leaving directory `/home/rhzhou/openjdk/JVM/openjdk_7u4/build/hotspot/outputdir'
make[3]: *** [generic_build2] Error 2
make[3]: Leaving directory `/home/rhzhou/openjdk/jdk7u-dev/hotspot/make'
make[2]: *** [product] Error 2
make[2]: Leaving directory `/home/rhzhou/openjdk/jdk7u-dev/hotspot/make'
make[1]: *** [hotspot-build] Error 2
make[1]: Leaving directory `/home/rhzhou/openjdk/jdk7u-dev'
make: *** [build_product_image] Error 2

参照链接4的办法后出现Linking vm… /usr/bin/ld: cannot find -lstdc++的错误,发现这才是真正问题,然后参照链接5执行yum install libstdc++ -static后解决问题。
出现问题时各种调查和尝试,查看了很多别人的解决办法,发现很多办法都各不相同,看来可能会因为不同的原因而导致看似相同的问题。

编译成功

原本做好了出现很多问题的打算,没想到解决这一个问题就编译成功了:

Finished making images @ Wed Nov 28 09:41:29 CST 2018 ...
########################################################################
##### Leaving jdk for target(s) sanity all docs images             #####
########################################################################
##### Build time 00:07:05 jdk for target(s) sanity all docs images #####
########################################################################

#-- Build times ----------
Target all_product_build
Start 2018-11-28 09:32:43
End   2018-11-28 09:41:29
00:00:11 corba
00:01:21 hotspot
00:00:02 jaxp
00:00:03 jaxws
00:07:05 jdk
00:00:04 langtools
00:08:46 TOTAL
-------------------------

生成目录下的build/j2sdk-image目录即为JDK的完整编译结果,将它复制到JAVA_HOME目录就可以作为JDK使用。
build/hotspot/outputdir/linux_amd64_compiler2即为所生成的hotspot虚拟机目录。
编辑这一目录下的env.sh,添加

LD_LIBRARY_PATH=.:/usr/java/jdk1.7.0_80/jre/lib/amd64/native_threads:/usr/java/jdk1.7.0_80/jre/lib/amd64
export LD_LIBRARY_PATH

然后就可以将自己编译的虚拟机运行起来了。

. ./env.sh
./gamma -version
Using java runtime at: /usr/java/jdk1.7.0_80/jre
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
OpenJDK 64-Bit Server VM (build 24.80-b07, mixed mode)

参考链接

1.https://www.cnblogs.com/sxdcgaq8080/p/7492426.html
2.https://blog.csdn.net/lizhengjava/article/details/57400656
3.https://blog.csdn.net/hxm_Code/article/details/77417709
4.https://blog.csdn.net/qyp199312/article/details/42966785
5.https://blog.csdn.net/lizhengjava/article/details/57400656

你可能感兴趣的:(Java)