一、环境

Linux 系统:CentOS_6.5_x86_64

JDK 安装包:jdk-7u80-linux-x64.rpm

OpenJDK 源码包:OpenJDK7

下载路径:http://download.java.net/openjdk/jdk7/promoted/b147/openjdk-7-fcs-src-b147-27_jun_2011.zip

ANT 安装包:apache-ant-1.8.3-bin.zip

下载路径:http://archive.apache.org/dist/ant/binaries/apache-ant-1.8.3-bin.zip

网络环境:联网,因为有些包需要 yum 下载

二、操作步骤

1)安装必要的软件
安装 jdk-7u80-linux-x64.rpm(命令:rpm -ivh jdk-7u80-linux-x64.rpm)
安装 ant,步骤如下:
     ①解压(命令:unzip apache-ant-1.8.3-bin.zip)
     ②把解压出来的文件夹移动到预期的安装目录
     ③配置环境变量,打开 /etc/profile 文件,添加 ant 环境变量的配置,如下:
    
     ④更新配置文件(命令:source /etc/profile)
     ⑤查看是否安装正常(命令:ant -version)

2)上传OpenJDK源码包,可上传到任意目录(例如:/tmp/jdkBuild),并解压(命令:unzip openjdk-7-fcs-src-b147-27_jun_2011.zip)

3)配置环境变量

  1. #语言选项,这个必须设置,否则编译好后会出现一个HashTable的NPE错
  2. export LANG=C
  3.  
  4. #Bootstrap JDK的安装路径。必须设置
  5. export ALT_BOOTDIR=/usr/java/jdk1.7.0_80
  6. export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.7.0_80
  7.  
  8. #ant路径设置
  9. export ANT_HOME=/opt/apache-ant-1.8.3
  10.  
  11. #允许自动下载依赖
  12. export ALLOW_DOWNLOADS=true
  13.  
  14. #并行编译的线程数,设置为和CPU内核数量一致即可
  15. export HOTSPOT_BUILD_JOBS=6
  16. export ALT_PARALLEL_COMPILE_JOBS=6
  17.  
  18. #比较本次 build 出来的映像与先前版本的差异。这对我们来说没有意义
  19. #必须设置为 false,否则 sanity 检查会报缺少先前版本JDK的映像的错误提示
  20. #如果已经设置 dev 或者 DEV_ONLY=true ,这个不显式设置也行
  21. export SKIP_COMPARE_IMAGES=true
  22.  
  23. #使用预编译头文件,不加这个编译会慢一些
  24. export USE_PRECOMPILED_HEADER=true
  25.  
  26. #要编译的内容
  27. export BUILD_LANGTOOLS=true
  28. #export BUILD_JAXP=false
  29. #export BUILD_JAXWS=false
  30. #export BUILD_CORBA=false
  31. export BUILD_HOTSPOT=true
  32. export BUILD_JDK=true
  33.  
  34. #要编译的版本
  35. #export SKIP_DEBUG_BUILD=false
  36. #export SKIP_FASTDEBUG_BUILD=true
  37. #export DEBUG_NAME=debug
  38.  
  39. #把它设置为 false 可以避开 javaws 和浏览器 Java 插件之类的部分的 build
  40. BUILD_DEPLOY=false
  41.  
  42. #把它设置为 false 就不会 build 出安装包。因为安装包里有些奇怪的依赖
  43. #但即便不 build 出它也已经能得到完整的 JDK 映像,所以还是别 build 它好了
  44. BUILD_INSTALL=false
  45.  
  46. #编译结果所存放的路径
  47. export ALT_OUTPUTDIR=/tmp/jdkBuild/build
  48.  
  49. #这两个环境变量必须去掉,不然会有很诡异的事情发生(我没有具体查过这些"诡异的事情",Makefile脚本检查到有这 2 个变量就会提示警告)
  50. unset JAVA_HOME
  51. unset CLASSPATH

4)进入OpenJDK源码目录,检查配置是否全部正确(命令:make sanity),检查成功,效果如下:

5)开始编译(命令:make 2>&1 | tee $ALT_OUTPUTDIR/build.log)

6)编译成功效果图

三、问题解决

1) make sanity 提示 check your value of ALT_CUPS_HEADERS_PATH

原因:缺少cups-devel
解决方式:安装 cups-devel (命令:yum install cups-devel.x86_64)

2) yum 安装提示 Couldn't resolve host

原因:域名解析服务器未配置
解决方式:
方式一:(重启系统或网络服务后,修改会丢失)打开文件 /etc/resolv.conf ,添加域名服务器的地址配置

方式二:(永久修改)打开 linux 的网络配置文件 /etc/sysconfig/network-scripts/ifcfg-eth0,添加如下配置,重启系统或重启网络服务(命令:service network restart)

3)yum 安装提示 The requested URL returned error: 404 Not Found

原因:系统下载文件的时候识别到的 releasever 错误
解决方式:打开文件 /etc/yum.repos.d/CentOS-Base.repo ,修改 baseurl 值

4) make sanity 提示 FreeType version 2.3.0 or higher is required

原因:freetype 字体错误
解决方式:安装 freetype(命令:yum install freetype.x86_64 freetype-devel.x86_64)

5) make sanity 提示 The version of ant being used is older

原因:未安装 ant 或 ant 版本太低
解决方式:安装 ant,见上方步骤

6) make sanity 提示 You seem to not have installed ALSA 0.9.1 or higher

原因:缺少alsa的包
解决方式:安装alsa的包(命令:yum install alsa*)

7)make 编译提示 Redirection detected from https to http. Protocol switch unsafe, not allowed

原因:在这个build-drop-jaf_src.xml的96行中获取包下载的地址失效或有问题,就会导致改问题发生,这时你需要把那些包自己下载,主要是jdk7-jaf-2010_08_19.zip这个包下载不了
解决方式:
①下载依赖的jaxp、jaf、jaxws
jaxp145_01.zip: http://download.java.net/jaxp/1.4.5/jaxp145_01.zip 
jdk7-jaxws2_2_4-b03-2011_05_27.zip: http://download.java.net/glassfish/components/jax-ws/openjdk/jdk7/jdk7-jaxws2_2_4-b03-2011_05_27.zip 
jdk7-jaf-2010_08_19.zip:https://netix.dl.sourceforge.net/project/jdk7src/input-archives/jdk7-jaf-2010_08_19.zip 
②进入openjdk源码目录,创建drop文件夹(命令:mkdir drop),移动三个包到drop目录下
③配置环境变量(命令:export ALT_DROPS_DIR=/tmp/jdkBuild/openjdk/drop)
④再次执行make编译命令

8)make 编译提示 g++: Command not found

原因:g++没有安装或没有更新
解决方式:安装或更新g++(命令:yum -y update gcc 或 yum -y install gcc+ gcc-c++)

9)make 编译提示 symbol JVM_SetNativeThreadName, version SUNWprivate_1.1 not defined in file libjvm.so with link time reference

原因:不明
解决方式:换成jdk6来编译openjdk7,修改为jdk6后,需同时修改环境变量,如下:
export ALT_BOOTDIR=/usr/java/jdk1.6.0_45
export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_45

10)make 编译提示 time is more than 10 years from present

原因:时间不对
解决方式:修改 openjdk 源码目录下 CurrencyData.properties 文件内的时间
文件路径:openjdk/jdk/src/share/classes/java/util/CurrencyData.properties,时间修改为10年以内即可(我不确定是哪个时间的影响,那就都修改吧),修改位置如下:




11)make 编译提示 /usr/bin/ld: cannot find -lX11

原因:缺少 X11 相关的包
解决方式:安装libX11(命令:yum install *X11*)

12)make 编译提示 error: X11/Intrinsic.h: No such file or directory

原因:缺少 Xt-devel 的包
解决方式:安装 Xt-devel(命令:yum install libXt-devel)

13)make 编译提示 error: X11/extensions/shape.h: No such file or directory

原因:缺少 libXtst 的包
解决方式:安装 libXtst(命令:yum install libXtst-devel)

14)make 编译提示 error: X11/extensions/Xrender.h: No such file or directory

原因:缺少 Xrender-devel 的包
解决方式:安装 Xrender-devel(命令:yum install libXrender-devel)

四、脚本汇总

初始化配置脚本:initBuild(命令:source initBuild)

  1. export LANG=C
  2. export ALT_BOOTDIR=/usr/java/jdk1.6.0_45
  3. export ALT_JDK_IMPORT_PATH=/usr/java/jdk1.6.0_45
  4. export ANT_HOME=/opt/apache-ant-1.8.3
  5. export ALLOW_DOWNLOADS=true
  6. export HOTSPOT_BUILD_JOBS=4
  7. export ALT_PARALLEL_COMPILE_JOBS=4
  8. export SKIP_COMPARE_IMAGES=true
  9. export USE_PRECOMPILED_HEADER=true
  10. export BUILD_LANGTOOLS=true
  11. export BUILD_HOTSPOT=true
  12. export BUILD_JDK=true
  13. BUILD_DEPLOY=false
  14. BUILD_INSTALL=false
  15. export ALT_OUTPUTDIR=/tmp/jdkBuild/build
  16. export ALT_DROPS_DIR=/tmp/jdkBuild/openjdk/drop
  17. unset JAVA_HOME
  18. unset CLASSPATH

初始化安装脚本:initInstall.sh(命令:./initInstall.sh)

  1. yum install cups-devel.x86_64
  2. yum install freetype.x86_64 freetype-devel.x86_64
  3. yum install alsa*
  4. yum -y install gcc+ gcc-c++
  5. yum install *X11*
  6. yum install libXt-devel
  7. yum install libXtst-devel
  8. yum install libXrender-devel

五、参考资料

源码官网下载链接:

https://blog.csdn.net/chenyyhh92/article/details/78298510

编译JDK问题参考:

http://chenjingbo.iteye.com/blog/1117021

https://blog.csdn.net/pangencheng/article/details/80072880

https://blog.csdn.net/my_computer/article/details/37879469

http://blog.51cto.com/13266852/1962186

信步漫谈之JDK—源码编译的更多相关文章

  1. 跟踪调试JDK源码时遇到的问题及解决方法

    目录 问题描述 解决思路 在IntelliJ IDEA中调试JDK源码 在eclipse中调试JDK源码 总结 问题描述 最近在研究MyBatis的缓存机制,需要回顾一下HashMap的实现原理.于是 ...

  2. 重新编译jdk源码,启用debug信息

    我有一个不知道是好还是不好的习惯,搞不懂的一些玩意儿,喜欢调试然后单步执行看这玩意儿到底是怎么运行的. 今天看到正则表达式的时候,appendReplacement()这个方法怎么也看不明白它是怎么工 ...

  3. eclipse查看jdk源码,及反编译查看

    jdk中的包: dt.jar是关于运行环境的类库,主要是swing的包 tools.jar是关于一些工具的类库 rt.jar包含了jdk的基础类库,也就是你在java doc里面看到的所有的类的cla ...

  4. JDK源码重新编译——支持eclipse调试JDK源码--转载

    最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt.jar. 下面这六步是编译jdk的具体步骤: Step 1:   ...

  5. Hadoop源码编译过程

    一.           为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...

  6. JDK源码调试

    1.首先遇到了一个问题line unavailable,然后通过以下方式解决: http://blog.csdn.net/xuefeng0707/article/details/8738869 对于想 ...

  7. eclipse调试jdk源码

    摘要 介绍使用eclipse调试jdk源码 java是一门开源的程序设计语言,喜欢研究源码的java开发者总会忍不住debug一下jdk源码.虽然官方的jdk自带了源码包src.zip,然而在debu ...

  8. android源码编译过程

    1.下载好android源码包. 2.装好vm,ubuntu(如果能在实体机装linux更好). 3.安装所需要的deb包 在终端执行如下命令: sudo apt-get install flex b ...

  9. jdk源码调试功能

    JDK源码重新编译——支持eclipse调试JDK源码--转载 最近在研究jdk源码,发现debug时无法查看源码里的变量值. 因为sun提供的jdk并不能查看运行中的局部变量,需要重新编译一下rt. ...

随机推荐

  1. css 基本语法及页面引用:

    css基本语法: css的定义方法是: 选择器{ 属性:值; 属性:值; 属性:值; } 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性,每个属性有一个或多个值. 如: div{ w ...

  2. 【Tomcat】Tomcat配置JVM参数步骤

    这里向大家描述一下如何使用Tomcat配置JVM参数,Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个java虚拟机.您可以选择自己的需要选择不同的操作系统和对应的JDK ...

  3. angular.equals()

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Vue使用中常见问题

    1.安装sass时报未找到 1.原因应该同时安装:1.npm install --save-dev sass-loader    2.npm install --save-dev node-sass ...

  5. phpMyAdmin 4.8.x 本地文件包含漏洞利用

    phpMyAdmin 4.8.x 本地文件包含漏洞利用 今天ChaMd5安全团队公开了一个phpMyAdmin最新版中的本地文件包含漏洞:phpmyadmin4.8.1后台getshell.该漏洞利用 ...

  6. ASP.NET中Dataset的table数据合并、数据截取、数据排序

    1.两个相同字段表的合并: public static DataSet CombineTables(DataSet _ds, DataTable _dt1, DataTable _dt2) { Dat ...

  7. idea创建第一个普通java web项目

    1.新建项目(工作空间) 选择空项目 输入项目名称,点击完成 系统会默认选中Modules,点击上面的小+号创建模块->New Module 新建一个Java EE Web Applicatio ...

  8. Jquery逐行读取txt 文件

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  9. String工具类2

    1:比较字符串 public static void main(String[] args) { // String去创建对象有多种方式 // 方式1 直接字面值赋值 String s = " ...

  10. Multi-Projector Based Display Code ---- Download

    The code providing are for your reference. Please download the code according to your hareware confi ...