关于源代码
当前的openJDK的源代码已经被发布到了github上了,所以我们可以直接从github上下载到。
OpenJDK7u源码托管地址:https://github.com/openjdk/jdk7u
带后缀U的地址,或者发行的jdk包,表示当前版本下的持续跟新版。而他们对应的各自的正式发行版可以在其对应代码托管地址的tag中找到。
这里我们使用jdk7当前的最新更新的正式发行版作为源代码来编译,下载地址如下
https://github.com/openjdk/jdk7u/archive/refs/tags/jdk7u351-ga.tar.gz
关于BootstrapJDK
但凡是遇到了bootstrap这样的字眼,它所要解决的问题只有一个,那就是,当你掉进一个井里,你需要通过拉自己的靴子,把自己拉出井以实现自救。这是个哲学问题。言归正传,之所以需要bootstrapJDK,是因为jdk的编译过程需要执行java代码,也就是说 需要一个能正常运行的jdk存在。编译自己需要自己的存在!一般而言,这个bootstrapJDK由你当前编译jdk版本的上一个版本担当。
编译环境
本次编译使用的系统:GNU/Linux 发行版debian11
编译器:gcc-9.2.0
BootstrapJDK:jdk6
ant:apache-ant-1.7.1
开始编译jdk7u351-ga
首先我们建立一个干净的目录buildjdk,然后进入到这个目录中。
从上面的链接下载jdk7u351-ga的源代码包,然后解压会得到一个目录jdk7u-jdk7u351-ga。
jdk7u源代码目录介绍
目录名称 | 介绍 |
---|---|
hotspot | OpenJDK Hotspot Virtual Machine,这里包含着虚拟机的源代码和构建文件。 |
langtools | java语言的工具源码,例如javac、javap、javah等 |
corba | java中间件corba的源码目录和构建文件。 |
jaxws | java webservice相关的源代码目录。 |
jaxp | java解析xml相关的源代码目录。 |
jdk | OpenJDK的运行时库的源文件目录。 |
编译依赖工具
名称 | 说明 |
---|---|
Bootstrap JDK | 编译JDK需要使用的一个预先存在的jdk,这里我们使用JDK6。 下载地址:https://www.oracle.com/au/java/technologies/javase-java-archive-javase6-downloads.html |
ant | ant构建工具,编译JDK7时也需要用到。 下载地址:http://archive.apache.org/dist/ant/binaries/apache-ant-1.7.1-bin.zip |
gcc | gcc工具,这里特别注意,在编译jdk7时gcc版本>=10的话出现各种编译问题。官网要求的gcc最低版本为4.3,本教程使用gcc-9.2成功编译。 |
zip和unzip | zip工具版本>=2.2,unzip工具>=5.12。如果你的linux发行版的源上没有符合条件的版本可从这里下载自行安装。 下载地址:http://www.info-zip.org |
Common UNIX Printing System (CUPS) Headers | cpus的头文件,这个头文件一般可以通过在你的linux发行版上安装其对应的开发包获得。 |
XRender Extension Headers | XRender头文件,通向安装其对应的开发包即可。 |
FreeType 2 | FreeType的版本>=2.3,较新版本的linux发行版从源中安装的这个软件的默认目录可能与jdk7的默认搜寻路径不符,本教程中直接从源码边一个,后面会讲解。 下载地址:http://www.freetype.org |
Advanced Linux Sound Architecture (ALSA) | ALSA版本>=0.9.1。这个建议使用你自己的linux发行版的源进行安装。通常你可以使用关键字libasound在你的源中搜索,找到合适的版本进行安装。 |
编译选项
make选项 | 说明 |
---|---|
all | 构建一个完整的jdk,这也是默认选项。如果你直接执行make命令将执行这个选项规则。 |
help | 输出编译选项帮助信息。例如:make help |
sanity | 检测编译环境的设置以及需要的依赖是否正确。例如:make sanity |
clean | 清除编译时产生的临时文件。 |
环境变量设置
jdk7的编译行为很多都是由环境变量控制的,所以我们需要设置必要的环境变量。
环境变量名 | 说明 |
---|---|
ALT_BOOTDIR | 这个环境变量需要指定到Bootstrap JDK的安装目录,就是我们下载的那个jdk6安装包执行后得到的目录。 |
ALT_FREETYPE_LIB_PATH | 指向freetype2的安装目录下的lib目录 |
ALT_FREETYPE_HEADERS_PATH | 指向freetype2的安装目录下的include目录 |
gcc-9.2.0编译:
如果你使用的就是这个版本或者你想通过你的源来安装这个版本可跳过此步。
我们按照一下给出的版本进行下载对应的源码包。
注意,你需要找一个比较大的分区来编译gcc,因为gcc在编译过程中需要消耗大量的磁盘空间。你的剩余空间应该>=4.2GB
gcc-9.2.0:https://ftp.gnu.org/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz
gmp-6.2.0:https://ftp.gnu.org/gnu/gmp/gmp-6.2.0.tar.bz2
mpc-1.1.0:https://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
mpfr-4.0.2:https://ftp.gnu.org/gnu/mpfr/mpfr-4.0.2.tar.bz2
编译gcc需要切换到root权限下。
su root
解压缩gcc-9.2.0.tar.gz并进入到gcc的根目录:
tar -xvf gcc-9.2.0.tar.gz
cd gcc-9.2.0
然后解压缩mpfr-4.0.2.tar.bz2、mpc-1.1.0.tar.gz、gmp-6.2.0.tar.bz2,这三个包需要在gcc的源代码目录下解压,并且将其重名并把对应的版本号去掉。
tar -xvf gmp-6.2.0.tar.bz2
mv gmp-6.2.0 gmp
tar -xvf mpc-1.1.0.tar.gz
mv mpc-1.1.0 mpc
tar -xvf mpfr-4.0.2.tar.bz2
mv mpfr-4.0.2 mpfr
至此我们都需要在gcc-9.2.0的源代码根目录下
如果你的系统是64位的请在此目录下执行以下命令
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
然后执行命令
sed -e '1161 s|^|//|' \
-i libsanitizer/sanitizer_common/sanitizer_platform_limits_posix.cc
然后我们在此目录下新建一个build目录并进入到build目录下
mkdir -v build
cd build
然后执行编译前的检测命令
SED=sed \
../configure --prefix=/usr \
--enable-languages=c,c++ \
--disable-multilib \
--disable-bootstrap \
--with-system-zlib
然后开始执行make命令,下面的-j12是平行编译,可以根据你自己的cpu核心数指定,我的是12核的。
make -j12
编译完成后执行安装命令
make install
编译freetype2
先下载freetype2:https://download.savannah.gnu.org/releases/freetype/freetype-2.12.1.tar.gz
解压freetype-2.12.1.tar.gz,并进入freetype源代码目录
tar -xvf freetype-2.12.1.tar.gz
cd freetype-2.12.1
执行编译前检查命令:
./configure --prefix=自定义一个路径。 注意这里我们不要使用默认的路径,会污染你的当前系统。
然后编译安装,注意要记住安装路径,一会我们要用到。
make
make install
安装ant构建工具
下载ant:http://archive.apache.org/dist/ant/binaries/apache-ant-1.7.1-bin.zip
我们直接将其解压到buildsdk目录下即可
unzip apache-ant-1.7.1-bin.zip
设置环境变量
export PATH=ant安装目录/bin:$PATH
export ALT_BOOTDIR=jdk6的安装目录
export ALT_FREETYPE_LIB_PATH=刚才安装的freetype2安装目录/lib
export ALT_FREETYPE_HEADERS_PATH=刚才安装的freetype2安装目录/include
注意你不能设置JAVA_HOME环境变量。
如果你的环境中存在JAVA_HOME环境变量,你需要删除这个环境变量
unset JAVA_HOME
好了准备工作已经完成了我们可以开始真正的编译jdk7u了
首先我们需要先修复一个jdk7中存在的一个bug
修复文件为:jdk7u-jdk7u351-ga/hotspot/src/share/vm/runtime/os.cpp:1197行
将代码:strncpy(inpath, path, strlen(path));修改为 strcpy(inpath,path);
jdk7的编译环境检测,此命令最后输出:Sanity check passed.就可进行下一步了
make sanity
执行编译命令:
make all
经过漫长的等待你将会看到如下输出
至此我们jdk7u的编译就成功了,编译好的内容都放在路径:jdk7u-jdk7u351-ga/build/linux-amd64中
目录介绍
目录名称 | 说明 |
---|---|
j2re-image | 这个目录就是我们平时用到的jre,可以将其重命名为jre7u351,然后放到一个合适的地方我们就可以直接使用啦! |
j2sdk-image | 这就是我们平时用的jdk,我们可以将其命名为jdk7u351。然后我们就能正常使用啦! |
接下来让我们测试一下吧
进入目录jdk7u-jdk7u351-ga/build/linux-amd64/j2sdk-image/bin
执行命令:./java -version
我们看到了正常的版本输出。成功!!