- 前言
- 第2版与第1版的区别
- 本书面向的读者
- 如何阅读本书
- 语言约定
- 内容特色
- 参考资料
- 第一部分 走近 Java
- 第1章 走近 Java
- 第二部分 自动内存管理机制
- 第2章 Java 内存区域与内存溢出异常
- 第3章 垃圾收集器与内存分配策略
- 第4章 虚拟机性能监控与故障处理工具
- 第5章 调优案例分析与实战
- 第三部分 虚拟机执行子系统
- 第6章 类文件结构
- 第7章 虚拟机类加载机制
- 第8章 虚拟机字节码执行引擎
- 第9章 类加载及执行子系统的案例与实战
- 第四部分 程序编译与代码优化
- 第10章 早期(编译期)优化
- 第11章 晚期(运行期)优化
- 第五部分 高效并发
- 第12章 Java 内存模型与线程
- 第13章 线程安全与锁优化
- 附录
- 附录A 编译 Windows 版的 OpenJDK
- 附录B 虚拟机字节码指令表
- 附录C HotSpot 虚拟机主要参数表
- 附录D 对象查询语言(OQL)简介[1]
- 附录E JDK 历史版本轨迹
A.5 进行编译
现在需要下载的编译环境和依赖项目都准备齐全了,最后我们还需要对系统做一些设置以便编译能够顺利通过。
首先执行VS2010中的VCVARS32.BAT,这个批处理文件的目的主要是设置INCLUDE、LIB和PATH这几个环境变量,如果和笔者一样只是下载了编译器的话则需要手工设置它们,各个环境变量的设置值可以参考下面给出的代码清单A-1中的内容。批处理运行完之后建立“ALT_COMPILER_PATH”环境变量让Makefile知道在哪里可以找到编译器。
再建立“ALT_BOOTDIR”和“ALT_JDK_IMPORT_PATH”两个环境变量指向前面提到的JDK 1.6的安装目录。建立“ANT_HOME”指向Apache ANT的安装目录。建立的环境变量很多,为了避免遗漏,笔者写了一个批处理文件以供读者参考,如代码清单A-1所示。
代码清单A-1 环境变量设置
SET ALT_BOOTDIR=D:/_DevSpace/JDK 1.6.0_21 SET ALT_BINARY_PLUGS_PATH=D:/jdkBuild/jdk7plug/openjdk-binary-plugs SET ALT_JDK_IMPORT_PATH=D:/_DevSpace/JDK 1.6.0_21 SET ANT_HOME=D:/jdkBuild/apache-ant-1.7.0 SET ALT_MSVCRNN_DLL_PATH=D:/jdkBuild/msvcr100 SET ALT_DXSDK_PATH=D:/jdkBuild/msdxsdk SET ALT_COMPILER_PATH=D:/jdkBuild/vcpp2010.x86/bin SET ALT_FREETYPE_HEADERS_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/include SET ALT_FREETYPE_LIB_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/bin SET INCLUDE=D:/jdkBuild/vcpp2010.x86/include;D:/jdkBuild/vcpp2010.x86/sdk/Include;%INCLUDE% SET LIB=D:/jdkBuild/vcpp2010.x86/lib;D:/jdkBuild/vcpp2010.x86/sdk/Lib;%LIB% SET LIBPATH=D:/jdkBuild/vcpp2010.x86/lib;%LIB% SET PATH=D:/jdkBuild/vcpp2010.x86/bin;D:/jdkBuild/vcpp2010.x86/dll/x86;D:/Software/OpenSource/cygwin/bin;%ALT_FREETYPE_LIB_PATH%;%PATH%
最后还需要进行两项调整,虽然,官方文档没有说明这两项,但是必须要做完才能保证编译过程的顺利通过:一项是取消环境变量JAVA_HOME,这点很简单;另外一项是尽量在英文的操作系统上编译,如果不能在英文的系统上编译就把系统的文字格式调整为“英语(美国)”,在控制面板-区域和语言选项的第一个页签中可以设置。如果这个设置还不能更改就建立一个“BUILD_CORBA”的环境变量,将值设置为false,取消编译CORBA部分,否则Java IDL(idlj.exe)为*.idl文件生成CORBA适配器代码的时候会产生中文注释,而这些中文注释会因为字符集的问题而导致编译失败。
完成了上述的准备工作之后,我们终于可以开始编译了。进入控制台(Cmd.exe)后运行刚才准备好的设置环境变量的批处理文件,然后输入bash进入Bourne Again Shell环境(sh或ksh也可以)。如果JDK的安装源码中存在“jdk_generic_profile.sh”这个Shell脚本,先执行它,笔者下载的OpenJDK 7 B121版没有这个文件了,所以直接输入make sanity来检查我们前面所做的设置是否全部正确。如果一切顺利,那么几秒钟之后会有类似代码清单A-2所示的输出。
代码清单A-2 make sanity检查
D:\jdkBuild\openjdk7>bash bash-3.2$make sanity cygwin warning: MS-DOS style path detected:C:/Windows/system32/wscript.exe Preferred POSIX equivalent is:/cygdrive/c/Windows/system32/wscript.exe CYGWIN environment variable option"nodosfilewarning"turns off this warning. Consult the user's guide for more details about POSIX paths: http://cygwin.com/cygwin-ug-net/using.html#using-pathnames (cd./jdk/make&&\ ……因篇幅关系,中间省略了大量的输出内容…… OpenJDK-specific settings: FREETYPE_HEADERS_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/include ALT_FREETYPE_HEADERS_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/include FREETYPE_LIB_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/bin ALT_FREETYPE_LIB_PATH=D:/jdkBuild/freetype-2.3.5-1-bin/bin OPENJDK Import Binary Plug Settings: IMPORT_BINARY_PLUGS=true BINARY_PLUGS_JARFILE=D:/jdkBuild/jdk7plug/openjdk-binary-plugs/jre/lib/rt-closed.jar ALT_BINARY_PLUGS_JARFILE= BINARY_PLUGS_PATH=D:/jdkBuild/jdk7plug/openjdk-binary-plugs ALT_BINARY_PLUGS_PATH=D:/jdkBuild/jdk7plug/openjdk-binary-plugs BUILD_BINARY_PLUGS_PATH=J:/re/jdk/1.7.0/promoted/latest/openjdk/binaryplugs ALT_BUILD_BINARY_PLUGS_PATH= PLUG_LIBRARY_NAMES= Previous JDK Settings: PREVIOUS_RELEASE_PATH=USING-PREVIOUS_RELEASE_IMAGE ALT_PREVIOUS_RELEASE_PATH= PREVIOUS_JDK_VERSION=1.6.0 ALT_PREVIOUS_JDK_VERSION= PREVIOUS_JDK_FILE= ALT_PREVIOUS_JDK_FILE= PREVIOUS_JRE_FILE= ALT_PREVIOUS_JRE_FILE= PREVIOUS_RELEASE_IMAGE=D:/_DevSpace/JDK 1.6.0_21 ALT_PREVIOUS_RELEASE_IMAGE= Sanity check passed.
Makefile的Sanity检查过程输出了编译所需的所有环境变量,如果看到“Sanity check passed.”,说明检查过程通过了,可以输入“make”执行整个Makefile,笔者使用Core i5/4GB RAM的机器编译整个JDK大概需要半个多小时。如果失败则需要根据系统输出的失败原因,回头再检查一下对应的设置。并且最好在下一次编译之前先执行“make clean”来清理掉上次编译遗留的文件。
编译完成之后,打开OpenJDK源码下的build目录,看看是不是已经有一个编译好的JDK在那里等着了?执行一下“java-version”,看到以自己机器命名的JDK了吧,很有成就感吧!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论